|
|
1
11
回溯调用堆栈多个级别的唯一合理方法是抛出异常/终止。
也就是说,你
真正地
应该重新考虑你想做什么。程序员(包括你自己,六个月后)会期望,当函数调用完成时,它后面的语句会执行(除非抛出异常)。违反该期望将导致在
你还假设有
绝对没有情况
在这种情况下,在处理错误后继续操作是合适的。硬编码这样的假设实际上是一个确定的保证,一旦你有时间忘记它,你就会遇到一个情况,在打电话后需要继续
还有一个假设是 总是 想跳回去吗 确切地 调用堆栈中的两个级别。这是另一个一旦硬编码就会失败的假设。不仅在某些情况下,调用代码应该继续,而且在某些情况下,您还需要在调用堆栈上执行三个级别的操作。
那就吃吧
在手边的代码中,如果额外的一行只是说
最后,我还建议更改
|
|
|
2
4
你可以用
goto &NAME
,您从错误处理程序返回的值将返回到
子检查尺寸{
我的$x=shift;#你不会在下午x点说x美元从哪里来。
}
这是因为
我用
不过,这个设计对我来说似乎是个坏主意。 也许这是一个使用异常的好地方:
|
|
|
3
2
你的问题的答案非常难,我甚至不打算一一回答,因为这对你真正的问题来说是一个糟糕的解决方案。真正的问题是什么?问题是,您希望在深度嵌套的子例程调用中出现错误,从而使堆栈冒泡。这就是例外。
下面是您的代码重写,使用
然后当用户创建无效对象时。。。
或者他们可以用
如果你想在错误发生时做更多的事情,你可以包装
例外
正如daotoad所指出的,Try::Tiny是一个比straight更好的异常处理程序
看见 Should a Perl constructor return an undef or a "invalid" object? 更多的理由说明为什么例外是个好主意。 |
|
|
4
1
你可以用 Continuation::Escape 。这基本上允许您将“返回点”传递给错误处理程序。 |
|
|
5
0
可行但不好看的变通方法。 使用select语句。 如果有一个调用的函数my_func(),然后根据返回值进行一些错误处理,然后从调用方返回,则可以执行以下操作:
这是一个(丑陋的)单衬板,替代了:
如果你有很多函数可以调用和检查返回值,那就很方便了。 |
|
|
Carsten · 使用最近的搜索模式更改文本块 1 年前 |
|
|
A.Ellett · 测试-t STDIN与-t<STDIN> 1 年前 |
|
|
con · 如何跳转到foreach迭代的特定点? 1 年前 |