【更多流程控制】3. Go语言异常处理——panic

Go语言异常处理——panic

    在上一节,咱们已经了解到了足够多的error接口及其周边的知识。如今,是学习另一种异常处理方式的时候了。先来展现一个名词——panicpanic可被意译为运行时恐慌。由于它只有在程序运行的时候才会被“抛出来”。而且,恐慌是会被扩散的。当有运行时恐慌发生时,它会被迅速地向调用栈的上层传递。若是咱们不显式地处理它的话,程序的运行瞬间就会被终止。这里有一个专有名词——程序崩溃。内建函数panic可让咱们人为地产生一个运行时恐慌。不过,这种致命错误是能够被恢复的。在Go语言中,内建函数recover就能够作到这一点。
  
    实际上,内建函数panicrecover是天生的一对。前者用于产生运行时恐慌,然后者用于“恢复”它。不过要注意,recover函数必需要在defer语句中调用才有效。由于一旦有运行时恐慌发生,当前函数以及在调用栈上的全部代码都是失去对流程的控制权。只有defer语句携带的函数中的代码才可能在运行时恐慌迅速向调用栈上层蔓延时“拦截到”它。这里有一个能够起到此做用的defer语句的示例:函数

defer func() {
    if p := recover(); p != nil {
        fmt.Printf("Fatal error: %s\n", p)
    }
}()

    在这条defer语句中,咱们调用了recover函数。该函数会返回一个interface{}类型的值。还记得吗?interface{}表明空接口。Go语言中的任何类型都是它的实现类型。咱们把这个值赋给了变量p。若是p不为nil,那么就说明当前确有运行时恐慌发生。这时咱们需根据状况作相应处理。注意,一旦defer语句中的recover函数调用被执行了,运行时恐慌就会被恢复,不论咱们是否进行了后续处理。因此,咱们必定不要只“拦截”不处理。
  
    咱们下面来反观panic函数。该函数可接受一个interface{}类型的值做为其参数。也就是说,咱们能够在调用panic函数的时候能够传入任何类型的值。不过,我建议你们在这里只传入error类型的值。这样它表达的语义才是精确的。更重要的是,当咱们调用recover函数来“恢复”因为调用panic函数而引起的运行时恐慌的时候,获得的值正是调用后者时传给它的那个参数。所以,有这样一个约定是颇有必要的。
  
    总之,运行时恐慌表明程序运行过程当中的致命错误。咱们只应该在必要的时候引起它。人为引起运行时恐慌的方式是调用panic函数。recover函数是咱们常会用到的。由于在一般状况下,咱们确定不想由于运行时恐慌的意外发生而使程序崩溃。最后,在“恢复”运行时恐慌的时候,你们必定要注意处理措施的得当。学习

相关文章
相关标签/搜索