【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() //执行函数f,如果f中出现了panic,那么就可以恢复回来 return }求高手 详细讲解下上面代码 其中第六行 }() 这个是 什么意思?
【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
func throwsPanic(f func()) (b bool) { defer func() { if x := recover(); x != nil { b = true } }() f() //执行函数f,如果f中出现了panic,那么就可以恢复回来 return }求高手 详细讲解下上面代码 其中第六行 }() 这个是 什么意思?
引用来自“wwwmmm”的答案
引用来自“chai2010”的答案
引用来自“wwwmmm”的答案
引用来自“chai2010”的答案
引用来自“wwwmmm”的答案
引用来自“chai2010”的答案
如果f()出现panic, 那么当前函数会直接返回.
但是返回之前已经注册的defer函数会被依次调用(先进后出).
这样内置recover函数会检测当前是否在panic状态,
如果是在panic状态recover将返回非nil的值.
因此panic/defer/recover配合可以完成类似C++异常处理的机制.
但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.
对外, pkg一般会将panic转换为error由返回值返回.
panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.
如果f抛出panic异常, 且throwsPanic没调用recover截获异常,
那么throwsPanic将继续向它的调用者转递.
如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,
这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).
那如果 f() 出现异常的话 b = true 就是异常处理代码
为什么可以恢复正常呢?
是因为 有了返回结果 所以此函数就算正常执行完成了?这样嘛
如果F()出现异常的话, 在derfer执行recover时就已经处理了异常了.
b = true已经不是处于异常状态(相当于将异常态转换为正常状态的函数返回值).
引用来自“XinHuang”的答案
可以这么理解:
首先定义一个函数
fn = func() {
if x := recover(); x != nil {
b = true;
}
}
然后调用函数:fn()
引用来自“nowayout”的答案
可以这么理解:
首先定义一个函数
fn = func() {
if x := recover(); x != nil {
b = true;
}
}
然后调用函数:fn()
如果f()出现panic, 那么当前函数会直接返回.
但是返回之前已经注册的defer函数会被依次调用(先进后出).
这样内置recover函数会检测当前是否在panic状态,
如果是在panic状态recover将返回非nil的值.
因此panic/defer/recover配合可以完成类似C++异常处理的机制.
但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.
对外, pkg一般会将panic转换为error由返回值返回.
引用来自“chai2010”的答案
如果f()出现panic, 那么当前函数会直接返回.
但是返回之前已经注册的defer函数会被依次调用(先进后出).
这样内置recover函数会检测当前是否在panic状态,
如果是在panic状态recover将返回非nil的值.
因此panic/defer/recover配合可以完成类似C++异常处理的机制.
但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.
对外, pkg一般会将panic转换为error由返回值返回.
引用来自“wwwmmm”的答案
引用来自“chai2010”的答案
如果f()出现panic, 那么当前函数会直接返回.
但是返回之前已经注册的defer函数会被依次调用(先进后出).
这样内置recover函数会检测当前是否在panic状态,
如果是在panic状态recover将返回非nil的值.
因此panic/defer/recover配合可以完成类似C++异常处理的机制.
但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.
对外, pkg一般会将panic转换为error由返回值返回.
panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.
如果f抛出panic异常, 且throwsPanic没调用recover截获异常,
那么throwsPanic将继续向它的调用者转递.
如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,
这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).
引用来自“chai2010”的答案
引用来自“wwwmmm”的答案
引用来自“chai2010”的答案
如果f()出现panic, 那么当前函数会直接返回.
但是返回之前已经注册的defer函数会被依次调用(先进后出).
这样内置recover函数会检测当前是否在panic状态,
如果是在panic状态recover将返回非nil的值.
因此panic/defer/recover配合可以完成类似C++异常处理的机制.
但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.
对外, pkg一般会将panic转换为error由返回值返回.
panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.
如果f抛出panic异常, 且throwsPanic没调用recover截获异常,
那么throwsPanic将继续向它的调用者转递.
如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,
这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).