在app

时间:2015-12-17 12:10:47

标签: go error-handling

我有一个Go应用程序(Web服务),它在json中返回错误,如下所示:

{errorString: "internal server error"}

这不好,因为“内部服务器错误”只是一些程序员错误字符串对客户端无用。解决方案是添加错误代码:

{errCode: 1, errorString: "internal server error"}

现在,客户端知道1意味着“内部服务器错误”并且可以根据需要进行处理。例如,显示用户消息“内部服务器错误”或(在我的情况下)与俄语相同。

确定。

所以,显然我需要一些文件来描述所有的错误常量。 对于前者errors.go

const (
   ErrNo = iota

   // Common Errors
   ErrNotFound
   ErrInternalServerError

   **// More specified errors**
)

问题出在更多指定错误部分。

我有两种方式:

  1. 将所有错误定义在一个文件errors.go
  2. 尝试将特定错误发送到每个相关文件:
  3. 我的控制器分为包服务器中的几个文件:

    clienthandler.go - 用于客户端请求, orderhandler.go - 用于订单请求等。

    特定客户端错误必须是clienthandler.go中的位置,orderhandler.go中的订单错误

    但它是如何实现的?

    我知道一个简单的解决方案: 为每个控制器记录一些最大错误数,例如1000。

    clienthandler.go

    package server
    
    const (
       ErrCheckIdCity = 1000*1 + iota
       ErrCheckName
    )
    

    这是为此文件保留的1000个错误(从1000到1999)

    orderhandler.go

    package server
    
    const (
       ErrCheckIdCity = 1000*2 + iota
       ErrCheckItem
    )
    

    这是为此文件保留的1000个错误(从2000到2999)

    但不利的是,我们每个控制器限制自己1000个错误

    可能是一些更好的方式吗? 或者我只需要使用一个全局的errros.go文件)?

1 个答案:

答案 0 :(得分:3)

将每个错误放在原始位置并导出。

请参阅我的评论中的link

var ErrInvalidParam = fmt.Errorf(“invalid parameter [%s]”, param)

如果要添加错误代码,请创建新类型satisfying the error interface并添加相应的成员,如errorCode或相关数据。

如果需要,可以将构建方法创建为帮助程序,类似于errors.New