golang的错误处理和传统的try、catch不太一样,在做项目的时候为了写错误信息真的是适应了好半天。
最主要的一个点就是,err.Error()方法只是返回,或者说让你编辑错误信息用的方法,他并不是一个传统意义上的Exception,你可以把他理解成一个可以在panic和recover里输出的字符串。
而panic才是抛出异常的语句,这个语句你在项目中要慎用。异常需要你自己手动抛出,还必须自己写处理方法,如果你在一个同步执行的方法里写了panic且并没有recover,那么恭喜你,挨顿打吧。
传统的情景:
try{
下面我的代码可能会出错
}catch(一堆根本记不住的错误类型 ex){
console.write(我刚才出错了+ex)
}finally{
大家就当无事发生过
}
golang的情景:
func main(){
defer func(){
if err := recover(); err != nil {
做事情要悠着点,你刚才是不是 + err.Error()
}
}()
_,err:=随便写,出错算我输()
if err!=nil{
我可能出错了,我想打印一下错误信息
fmt.println(我刚才+err.Error())
但!
如果我不写panic,recover是不会截获我的。
}
所以我还是会往下执行的
...
_,err=一个会引发panic的方法()
if err!=nil{
你在程序内部已经引发panic了,你现在进不到这个判断当中,会直接被recover捕获
}
}
func 随便写,出错算我输() (int,error){
if 我心情不好{
return 0,errors.New("这是我自己编辑的错误信息,我认为在某种条件下,我输入的参数或者我程序执行的步骤是错误的,所以我写一条error返回去")
}
我的流程
return 1,nil
}
func 一个会引发panic的方法() (int,error){
err:=errors.New("刚开始就panic")
panic(err)
return 0,err //unreachable code
}
网友评论