在通常情况下,向程序使用方报告错误状态的方式可以是返回一个额外的error类型值。

但是,当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起painc异常。这时,上述错误处理方式显然就不适合了。反过来讲,在一般情况下,我们不应通过调用panic函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时,我们就应该调用panic。

一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成线程,在中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。

不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。

  1. func panic(v interface{})

调用panic函数引发的panic异常:

  1. func TestA() {
  2. fmt.Println("func TestA()")
  3. }
  4. func TestB() {
  5. panic("func TestB(): panic")
  6. }
  7. func TestC() {
  8. fmt.Println("func TestC()")
  9. }
  10. func main() {
  11. TestA()
  12. TestB()//TestB()发生异常,中断程序
  13. TestC()
  14. }

内置的panic函数引发的panic异常:

  1. func TestA() {
  2. fmt.Println("func TestA()")
  3. }
  4. func TestB(x int) {
  5. var a [10]int
  6. a[x] = 222 //x值为11时,数组越界
  7. }
  8. func TestC() {
  9. fmt.Println("func TestC()")
  10. }
  11. func main() {
  12. TestA()
  13. TestB(11)//TestB()发生异常,中断程序
  14. TestC()
  15. }
作者:admin  创建时间:2018-06-18 06:12
 更新时间:2018-06-18 06:15
上一篇:
下一篇: