2 回答
TA贡献1779条经验 获得超6个赞
Go 中的"Escaping" panic
s 1(我的意思是,那些可能由构成包的公共 API 的函数产生的)是用来处理程序员所做的错误。因此,如果您的函数获得一个指向对象的指针,并且这不能nil
(例如,指示该值丢失),则继续并取消引用该指针以使运行时panic
本身(如果它恰好是nil
. 如果一个函数需要一个必须在某个范围内的整数,panic
如果它不在那个范围内——因为在一个正确的程序中,所有可能传递给你的函数的值都是 在那个范围内,如果他们不这样做,那么要么程序员没有遵守 API,要么他们没有清理从外部获取的值,这又不是你的错。
在另一方面,如故障问题打开一个文件或pefrorm你的函数应该执行一些其他动作正确调用时应该不会引起panic
S和函数返回一个适当的错误信息。
请注意,null
在 .NET 和 Java 代码中对公共 API 函数中的参数进行显式检查的建议具有不同的目标,即使此类错误更具可读性。但是由于 99% 的 .NET 和 Java 代码只是让所有异常传播到顶层(然后显示或可能被记录),因此它只是用另一个替换一个(由运行时生成的)异常。这可能会使错误更加明显——在 API 函数中执行失败,而不是在调用堆栈更深处的某个地方——但会为这些 API 函数增加不必要的麻烦。所以是的,这是自以为是,但我的主观意见是:在 Go 中让它崩溃是可以的——你会得到一个描述性的堆栈跟踪。
TL; 博士
关于运行时问题的处理,
panic
s 用于编程错误;返回错误是针对执行预期功能任务的问题。
1panic
s 的另一个合法用途是从深度递归处理/计算返回的快速“冷路径”;在这种情况下,panic
应该由您的包捕获和处理,并且相应的公共 API 函数应该返回错误。有关更多信息,请参阅此和此。
- 2 回答
- 0 关注
- 176 浏览
添加回答
举报