从Delphi到Go——异常处理

Delphi

try...finally...end

//创建、打开、加锁等
try
  //具体处理
finally
//释放、关闭、解锁等
end;

raise

raise Exception.Create("异常信息"); //手动抛出异常

try...except...end

try
  //可能产生异常的语句块
except
  //异常的相关处理
  on E: Exception do
  begin
    //对应类型的异常的处理
  end;
end;

Go

defer

defer的语句会延迟到函数调用结束返回时才执行,相当于finally...end区。存在多个defer语句时,最先出现的总是最后才执行。

func F(){
  //打开、加锁等
  defer //关闭、解锁等
  //具体处理
}

panic

panic(异常信息)

recover

func FF(){
  defer func(){
    e := recover()
    //异常处理
  }()
  //可能产生异常的语句块,或调用 panic() 抛出异常
}

虽然panic/recover组合可以模拟try...except...end,但不建议在编写普通函数时也经常性使用这种特性。

error

errorGo内置的错误接口,也是官方推荐的优先使用的错误处理方法。

Go很多方法最后一个返回值都是error类型的err,在进行下一步操作前,需要先判断err是否为nil,为nil则继续,否则进行错误处理。

r, e := callfunc()
if e != nil {
  //错误处理
} else {
  //后续操作
}

至于自定义错误,在学完接口之后再说吧。