英文:
Handling errors for debugging in Go
问题
我想知道在调试应用程序时,是否有更好的处理错误的方法。我想设置一个名为'debug'的标志,它将显示从函数返回的真实错误(例如来自SQL)。如果未设置该标志,我希望返回一个通用的消息。
我在这里创建了一个按照这种方式工作的示例:
http://play.golang.org/p/YDeqVvRSMd
总体思路是我将真实错误和我的默认错误传递给一个函数,并检查是否设置了debug标志:
func ErrorMsg(debug, error_type error) map[string]interface{} {
var msg error
if Debug {
msg = debug
} else {
msg = error_type
}
err := map[string]interface{}{"error_message": msg}
return err
}
然而,这种方法似乎有些丑陋。有没有更好的方法来实现这个目标?
另外,我想返回一个JSON响应,这就是为什么使用了一个map的原因。
英文:
I'm wondering if there are any better methods for handling errors in an application for debugging. I want to have a flag like 'debug' set, and it will display the real errors returned (like for example from sql) from the functions. If it isn't set I want it to return a generic message.
I made something that works this way here:
http://play.golang.org/p/YDeqVvRSMd
The general idea is I pass the real error and my stock error into a function and it checks to see if debug is set:
func ErrorMsg(debug, error_type error) map[string]interface{} {
var msg error
if Debug {
msg = debug
} else {
msg = error_type
}
err := map[string]interface{}{"error_message": msg}
return err
}
However this kinda seems like an ugly solution. Is there a better way to accomplish this?
Also I want to return a JSON response, which is why it's a map.
答案1
得分: 2
Go是一种非常冗长的语言,你无法做太多来简化代码,这是一个稍微缩短一点的版本:
func ErrorMsg(debug, error_type error) map[string]interface{} {
msg := error_type
if Debug {
msg = debug
}
return map[string]interface{}{"error_message": msg}
}
或者你可以完全去掉map,直接返回错误并在错误结构体上设置json标签:
type RequestError struct {
ErrorString string `json:"error_message"`
}
func ErrorMsg(debug, error_type error) (err error) {
err = error_type
if Debug {
err = debug
}
return
}
英文:
Go is a very verbose language, there isn't much you can do to clean that code up, here's a tiny bit shorter version:
func ErrorMsg(debug, error_type error) map[string]interface{} {
msg := error_type
if Debug {
msg = debug
}
return map[string]interface{}{"error_message": msg}
}
Or you can drop the map all together and return the error directly and set json tags on the error struct:
type RequestError struct {
ErrorString string `json:"error_message"`
}
func ErrorMsg(debug, error_type error) (err error) {
err = error_type
if Debug {
err = debug
}
return
}
答案2
得分: 2
你可以创建一个名为DebugError
的类型,其中包含显示错误和调试错误,该类型还应实现Error
接口。然后,你可以使用一个辅助函数来打印错误。
package main
import (
"errors"
"fmt"
)
var ErrInternal = errors.New("Internal Server Error")
type DebugError struct {
Display error
Debug error
}
// Error实现了error接口
// 使用Display错误
func (err DebugError) Error() string {
return err.Display.Error()
}
func main() {
err := someSqlCall()
if err != nil {
// 调试错误
fmt.Println(getError(err, true))
// 显示错误
fmt.Println(getError(err, false))
}
}
// 模拟SQL函数
func someSqlCall() error {
return DebugError{
Display: ErrInternal,
Debug: errors.New("Real sql error goes here"),
}
}
// getError是一个辅助函数,返回调试或显示错误
func getError(err error, debug bool) error {
debugErr, ok := err.(DebugError)
if !ok {
// 不是调试错误
return err
}
if debug {
return debugErr.Debug
}
return debugErr.Display
}
附注:个人而言,我会保持简单,并记录所有的错误。
英文:
You could create a DebugError
type that contains both your display and debug error, this type would also implement the Error interface. Then you could use a helper function to print the error.
package main
import (
"errors"
"fmt"
)
var ErrInternal = errors.New("Internal Server Error")
type DebugError struct {
Display error
Debug error
}
// Error implements the error interface
// Uses the Display error
func (err DebugError) Error() string {
return err.Display.Error()
}
func main() {
err := someSqlCall()
if err != nil {
// debug error
fmt.Println(getError(err, true))
// display error
fmt.Println(getError(err, false))
}
}
// mock sql function
func someSqlCall() error {
return DebugError{
Display: ErrInternal,
Debug: errors.New("Real sql error goes here"),
}
}
// getError is a helper function that returns a debug or display error
func getError(err error, debug bool) error {
debugErr, ok := err.(DebugError)
if !ok {
// not a debug error
return err
}
if debug {
return debugErr.Debug
}
return debugErr.Display
}
Go play.
P.S. Personally I keep it simple and log all of my errors.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论