Golang 指南程序员首页投稿(暂停使用,暂停投稿)

(译)Go 语言中异常处理的艺术

2017-09-07  本文已影响724人  谢烟客

原文链接:The Art of Error Handling in Go

Go 语言的异常处理与其他语言截然不同,Go 语言中没有 try catch 或 except。取而代之的是 Go 中的每一个函数都期待返回一个 error 变量,调用者负责相应的检查及处理。当函数返回异常时,有 5 种常见的策略进行处理:

  1. 策略一:向外层传递异常

    因此,子函数的异常将被视为程序执行失败。这个示例包含 2 个函数,GetLink() 函数的中的异常向上传递到了 main 函数中。这在 Go 语言的异常处理中是非常常见的策略。 image.png
  2. 策略二:异常抛出后进行不断重试

    对于一些未知或者临时性异常,重试机制是是非常有益的。在彻底放弃之前可以通过增加延迟或者重试次数的限制进行一些重试的操作。 image.png
  3. 策略三:更优雅的退出程序

    如果程序在发生异常后已经不可用,那么打印异常信息并优雅的退出是更好的选择,但这种策略的操作必须在 main 函数中进行。 image.png
    子程序或者子函数中产生异常,应该将异常向上传递,并且子程序不应该执行退出策略。
    异常日志的信息最好使用 log 包进行打印,log 包提供了一些除异常信息以外的有用信息,这对长时间运行的程序来说是非常的有用处的。 image.png
    因此,log 包将给出异常的确切日期及时间。
  4. 策略四:日志与继续执行

    这种情况下,记录异常的日志就足够了,然后继续执行程序流程,也许还需要进行一些功能降级。 image.png
    在这里 redis 客户端尝试 ping 服务端,如果发生异常,只进行日志的记录并且其他操作继续进行。这个策略的执行前提是产生的异常不会对程序的流程造成巨大影响。
  5. 策略五:忽略异常

    这也许是最糟糕的策略,那就是忽略异常继续前行。 image.png
    在这里 os.RemoveAll(dir) 函数如果抛出异常将被忽略,因为操作系统会定期清理 temp 目录,所以即使 os.RemoveAll(dir) 执行失败也不会对程序流程造成影响。

    如果执行此策略,忽略异常是可以的但是一定不要忘记写文档!

上一篇下一篇

猜你喜欢

热点阅读