mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-11-28 09:09:07 +00:00
commit
bf67e042e9
@ -25,7 +25,7 @@ deferred函数帮助Parse从panic中恢复。在deferred函数内部,panic val
|
|||||||
|
|
||||||
有时我们很难完全遵循规范,举个例子,net/http包中提供了一个web服务器,将收到的请求分发给用户提供的处理函数。很显然,我们不能因为某个处理函数引发的panic异常,杀掉整个进程;web服务器遇到处理函数导致的panic时会调用recover,输出堆栈信息,继续运行。这样的做法在实践中很便捷,但也会引起资源泄漏,或是因为recover操作,导致其他问题。
|
有时我们很难完全遵循规范,举个例子,net/http包中提供了一个web服务器,将收到的请求分发给用户提供的处理函数。很显然,我们不能因为某个处理函数引发的panic异常,杀掉整个进程;web服务器遇到处理函数导致的panic时会调用recover,输出堆栈信息,继续运行。这样的做法在实践中很便捷,但也会引起资源泄漏,或是因为recover操作,导致其他问题。
|
||||||
|
|
||||||
基于以上原因,安全的做法是有选择性的recover。换句话说,只恢复应该被恢复的panic异常,此外,这些异常所占的比例应该尽可能的低。为了标识某个panic是否应该被恢复,我们可以将panic value设置成特殊类型。在recover时对panic value进行检查,如果发现panic value是特殊类型,就将这个panic作为errror处理,如果不是,则按照正常的panic进行处理(在下面的例子中,我们会看到这种方式)。
|
基于以上原因,安全的做法是有选择性的recover。换句话说,只恢复应该被恢复的panic异常,此外,这些异常所占的比例应该尽可能的低。为了标识某个panic是否应该被恢复,我们可以将panic value设置成特殊类型。在recover时对panic value进行检查,如果发现panic value是特殊类型,就将这个panic作为error处理,如果不是,则按照正常的panic进行处理(在下面的例子中,我们会看到这种方式)。
|
||||||
|
|
||||||
下面的例子是title函数的变形,如果HTML页面包含多个`<title>`,该函数会给调用者返回一个错误(error)。在soleTitle内部处理时,如果检测到有多个`<title>`,会调用panic,阻止函数继续递归,并将特殊类型bailout作为panic的参数。
|
下面的例子是title函数的变形,如果HTML页面包含多个`<title>`,该函数会给调用者返回一个错误(error)。在soleTitle内部处理时,如果检测到有多个`<title>`,会调用panic,阻止函数继续递归,并将特殊类型bailout作为panic的参数。
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user