Panic和Recover 求解答

wwwmmm 发布于 2012/12/18 10:47
阅读 599
收藏 1
Go

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

func throwsPanic(f func()) (b bool) {
    defer func() {
        if x := recover(); x != nil {
            b = true
        }
    }()
    f() //执行函数f,如果f中出现了panic,那么就可以恢复回来
    return
}
求高手 详细讲解下上面代码 其中第六行 }() 这个是 什么意思?
加载中
0
chai2010
chai2010

引用来自“wwwmmm”的答案

引用来自“chai2010”的答案

引用来自“wwwmmm”的答案

引用来自“chai2010”的答案

引用来自“wwwmmm”的答案

引用来自“chai2010”的答案

如果f()出现panic, 那么当前函数会直接返回.

但是返回之前已经注册的defer函数会被依次调用(先进后出).

这样内置recover函数会检测当前是否在panic状态, 

如果是在panic状态recover将返回非nil的值.

因此panic/defer/recover配合可以完成类似C++异常处理的机制.

但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.

对外, pkg一般会将panic转换为error由返回值返回.

谢谢回答, 是不是可以理解为通过  throwsPanic 来运行并检测f func()中是否有panic状态  如果有 就返回b    pkg一般会 将b 换为error返回 不是直接返回true 这样

panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.

如果f抛出panic异常, 且throwsPanic没调用recover截获异常,  

那么throwsPanic将继续向它的调用者转递.

如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,

这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).

if x := recover(); x != nil {

        //这里是异常处理代码
        //如果是可以处理的异常 就恢复了正常状态了
        //应该是这样吧
 }
是的. 如果f()没有异常的话, 这段代码就不会被执行到.

那如果 f() 出现异常的话  b = true  就是异常处理代码  

为什么可以恢复正常呢?

是因为 有了返回结果  所以此函数就算正常执行完成了?这样嘛

如果F()出现异常的话, 在derfer执行recover时就已经处理了异常了.

b = true已经不是处于异常状态(相当于将异常态转换为正常状态的函数返回值).

wwwmmm
wwwmmm
非常感谢 明白了
0
X
XinHuang
表示函数调用
0
wwwmmm
wwwmmm

引用来自“XinHuang”的答案

表示函数调用
谢谢  但是 不是 很详细啊
0
李察德-泰森
李察德-泰森

可以这么理解:

首先定义一个函数

fn = func() {

    if x := recover(); x != nil {

        b = true;

    }

}

然后调用函数:fn()

0
wwwmmm
wwwmmm

引用来自“nowayout”的答案

可以这么理解:

首先定义一个函数

fn = func() {

    if x := recover(); x != nil {

        b = true;

    }

}

然后调用函数:fn()

匿名函数 是吧  这个懂 那代码中关于 Panic和Recover的 能否 详细解答下   最好 解释下 执行流程之类的   Thanks 
0
chai2010
chai2010

如果f()出现panic, 那么当前函数会直接返回.

但是返回之前已经注册的defer函数会被依次调用(先进后出).

这样内置recover函数会检测当前是否在panic状态, 

如果是在panic状态recover将返回非nil的值.

因此panic/defer/recover配合可以完成类似C++异常处理的机制.

但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.

对外, pkg一般会将panic转换为error由返回值返回.

0
wwwmmm
wwwmmm

引用来自“chai2010”的答案

如果f()出现panic, 那么当前函数会直接返回.

但是返回之前已经注册的defer函数会被依次调用(先进后出).

这样内置recover函数会检测当前是否在panic状态, 

如果是在panic状态recover将返回非nil的值.

因此panic/defer/recover配合可以完成类似C++异常处理的机制.

但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.

对外, pkg一般会将panic转换为error由返回值返回.

谢谢回答, 是不是可以理解为通过  throwsPanic 来运行并检测f func()中是否有panic状态  如果有 就返回b    pkg一般会 将b 换为error返回 不是直接返回true 这样
0
chai2010
chai2010

引用来自“wwwmmm”的答案

引用来自“chai2010”的答案

如果f()出现panic, 那么当前函数会直接返回.

但是返回之前已经注册的defer函数会被依次调用(先进后出).

这样内置recover函数会检测当前是否在panic状态, 

如果是在panic状态recover将返回非nil的值.

因此panic/defer/recover配合可以完成类似C++异常处理的机制.

但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.

对外, pkg一般会将panic转换为error由返回值返回.

谢谢回答, 是不是可以理解为通过  throwsPanic 来运行并检测f func()中是否有panic状态  如果有 就返回b    pkg一般会 将b 换为error返回 不是直接返回true 这样

panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.

如果f抛出panic异常, 且throwsPanic没调用recover截获异常,  

那么throwsPanic将继续向它的调用者转递.

如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,

这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).

0
wwwmmm
wwwmmm

引用来自“chai2010”的答案

引用来自“wwwmmm”的答案

引用来自“chai2010”的答案

如果f()出现panic, 那么当前函数会直接返回.

但是返回之前已经注册的defer函数会被依次调用(先进后出).

这样内置recover函数会检测当前是否在panic状态, 

如果是在panic状态recover将返回非nil的值.

因此panic/defer/recover配合可以完成类似C++异常处理的机制.

但是, 按照Go的习惯, recover只是用着pkg内部多层嵌套的错误.

对外, pkg一般会将panic转换为error由返回值返回.

谢谢回答, 是不是可以理解为通过  throwsPanic 来运行并检测f func()中是否有panic状态  如果有 就返回b    pkg一般会 将b 换为error返回 不是直接返回true 这样

panic是安装函数调用堆栈的顺序回溯, 不是正常函数的返回值.

如果f抛出panic异常, 且throwsPanic没调用recover截获异常,  

那么throwsPanic将继续向它的调用者转递.

如果调用了recover, 且返回值是非nil的, 那么可以执行异常处理代码,

这个时候函数已经正常状态了(当然也可以继续调用panic恢复这个异常).

if x := recover(); x != nil {

        //这里是异常处理代码
        //如果是可以处理的异常 就恢复了正常状态了
        //应该是这样吧
 }
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部