This commit is contained in:
hongruiqi
2013-01-28 18:35:56 +08:00
parent 47b0b70866
commit ebbed629ae

10
12.2.md
View File

@@ -11,15 +11,15 @@
- 文件系统和权限应用读取不存在的文件或者读取没有权限的文件、或者写入一个不允许写入的文件这些都会导致一个错误。应用读取的文件如果格式不正确也会报错例如配置文件应该是ini的配置格式而设置成了json格式就会报错。
- 第三方应用:如果我们的应用程序耦合了其他第三方接口程序,例如应用程序发表文章之后自动调用接发微博的接口,所以这个接口必须正常运行才能完成我们发表一篇文章的功能。
- HTTP错误这些错误是根据用户的请求出现的错误最常见的就是404请求,虽然可能会出现很多不同的错误但其中比较常见的错误还有401未授权错误(需要认证才能访问的资源)、403禁止错误(不允许用户访问的资源)和503错误(程序内部出错)。
- HTTP错误这些错误是根据用户的请求出现的错误最常见的就是404错误。虽然可能会出现很多不同的错误但其中比较常见的错误还有401未授权错误(需要认证才能访问的资源)、403禁止错误(不允许用户访问的资源)和503错误(程序内部出错)。
- 操作系统出错:这类错误都是由于应用程序上的操作系统出现错误引起的,主要有操作系统的资源被分配完了,导致死机,还有操作系统的磁盘满了,导致无法写入,这样就会引起很多错误。
- 网络出错:指两方面的错误,一方面是用户请求应用程序的时候出现网络断开,这样就导致连接中断,这种错误不会造成应用程序的崩溃,但是会影响用户访问的效果;另一方面是应用程序读取其他网络上的数据,其他网络断开会导致读取失败,这种需要对应用程序做有效的测试,能够避免这类问题出现的情况下程序崩溃。
## 错误处理的目标
在实现错误处理之前,我们必须明确错误处理想要达到的目标是什么,错误处理系统应该完成以下工作:
- 通知访问用户出现错误了不论出现的是一个系统错误还是用户错误用户都应当知道Web应用出了问题用户的这次请求无法正确的完成了。例如用户的错误请求我们显示一个统一的错误页面(404.html)出现系统错误我们通过自定义的错误页面显示系统暂时不可用之类的错误页面(error.html)
- 记录错误:系统出错误一般就是我们调用函数的时候返回err不为nil的情况,使用前面小节介绍的日志系统记录到日志文件如果是一些致命错误通过邮件通知系统管理员,例如一般404之类的错误不需要发送邮件只需要记录到日志系统。
- 通知访问用户出现错误了不论出现的是一个系统错误还是用户错误用户都应当知道Web应用出了问题用户的这次请求无法正确的完成了。例如,对于用户的错误请求我们显示一个统一的错误页面(404.html)出现系统错误时,我们通过自定义的错误页面显示系统暂时不可用之类的错误页面(error.html)
- 记录错误:系统出错误一般就是我们调用函数的时候返回err不为nil的情况可以使用前面小节介绍的日志系统记录到日志文件如果是一些致命错误,则通过邮件通知系统管理员一般404之类的错误不需要发送邮件只需要记录到日志系统。
- 回滚当前的请求操作:如果一个用户请求过程中出现了一个服务器错误,那么已完成的操作需要回滚。下面来看一个例子:一个系统将用户递交的表单保存到数据库,并将这个数据递交到一个第三方服务器,但是第三方服务器挂了,这就导致一个错误,那么先前存储到数据库的表单数据应该删除(应告知无效),而且应该通知用户系统出现错误了。
- 保证现有程序可运行可服务:我们知道没有人能保证程序一定能够一直正常的运行着,万一哪一天程序崩溃了,那么我们就需要记录错误,然后立刻让程序重新运行起来,让程序继续提供服务,然后再通知系统管理员,通过日志等找出问题。
@@ -114,11 +114,11 @@
return
}
上面介绍了错误和异常的区别,那么我们在开发程序的时候如何来设计呢?规则很简单:如果你定义的函数无论如何有无可能失败它就应该返回一个错误。当我调用其他package的函数时如果这个函数实现的很好我不需要担心它会panic除非有真正的异常情况发生即使那样也不应该是我去处理它。而panic和recover是针对自己开发package里面实现的逻辑针对一些特殊情况来设计。
上面介绍了错误和异常的区别,那么我们在开发程序的时候如何来设计呢?规则很简单:如果你定义的函数可能失败它就应该返回一个错误。当我调用其他package的函数时如果这个函数实现的很好我不需要担心它会panic除非有真正的异常情况发生即使那样也不应该是我去处理它。而panic和recover是针对自己开发package里面实现的逻辑针对一些特殊情况来设计。
## 小结
本小节总结了当我们的Web应用部署之后如何处理各种错误网络错误、数据库错误、操作系统错误等当错误发生时我们的程序如何来正确处理显示友好的出错界面、回滚操作、记录日志、通知管理员等操作最后介绍了如何来正确处理错误和异常。一般的程序中错误和异常很容易混淆的但是在Go中错误和异常是有明显的区分所以告诉我们在程序设计中处理错误和异常应该遵循怎么样的原则。
## links
* [目录](<preface.md>)
* 上一章: [应用日志](<12.1.md>)
* 下一节: [应用部署](<12.3.md>)
* 下一节: [应用部署](<12.3.md>)