【问题标题】:Succinct way to change thrown Exception to Failure?将抛出的异常更改为失败的简洁方法?
【发布时间】:2018-09-28 03:04:52
【问题描述】:

有没有比以下更简洁的方法将抛出的异常提升为失败?

try {
    die 'always';
    CATCH { default { fail $_ } }
}

【问题讨论】:

  • Aiui try 自动将抛出的异常“提升”为失败默认情况下(并将其放入错误变量$!) .所以最简洁的表达方式是try die 'always';
  • 您的问题涉及官方 P6 行为,而不是 Rakudo 特定的问题。如果您由于去年的“让我们叫 P6 Rakudo”模因而添加了 rakudo 标签,请注意那已经过时(或至少暂时搁置)。 Anyhoo,您是否介意删除rakudo 标签,或者,如果这不合适,请评论您为什么要在您的问题上使用它? TIA。

标签: error-handling exception-handling try-catch raku rakudo


【解决方案1】:

这里有一个更简洁的 moritz 代码版本。

(try something()) orelse fail $!;

【讨论】:

  • (try something) // fail 也适用于最近的 Rakudo。 //orelse 类似,只是它具有更高的优先级(适用于这个习语)并且没有别名 $_(对于这个习语来说是不必要的)。文档似乎没有显示不带参数调用fail 的选项,但Rakudo source 显示它将提取调用者的$!。我发现fail.t 相当难以理解,所以我不会谈论我的建议是否得到官方支持。
  • (try something) // fail 也会在something 返回未定义的值(甚至不抛出异常)时触发。
【解决方案2】:
try something();
fail $! if $!;

请注意,CATCH 块适用于同一范围内的所有语句,甚至适用于 CATCH 块之后的代码。因此,如果您想使用 CATCH 块,请注意保持范围较小。

【讨论】:

    【解决方案3】:

    try 块是多余的

    die 'always';
    CATCH { default { fail $_; } }
    

    但我不会担心保存键入的字符。您的意图清晰且可读性强。

    以表达您的意图或可读性为代价保存键入的字符可能在 Perl 的遗产中占有一席之地,但它不是您希望自己进行维护编程的地方。

    【讨论】:

    • fail 也作为Exception 上的方法存在,因此您也可以:CATCH { default { .fail } }
    • 除了(try die 'always') // fail这样更简洁的成语之外,写CATCH { .fail }而不是CATCH { default { .fail } }不是更好吗?我认为它清楚地表达了意图并且具有高度可读性。它似乎像我打算在最近的 Rakudo 上那样工作。添加default 似乎使垂死的信息变得更糟,而且我的探索并没有揭示出一种使事情变得更好的方法。 Aiui 在CATCH 块中使用whendefault 语句将传入的异常标记为已处理,但如果块然后fails out,那不是没有意义吗?
    • 对于简单的代码,如果您有 CATCH 块,则 try 是多余的,相反,如果您有 try,则 CATCH 块是多余的。
    猜你喜欢
    • 2014-11-24
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2018-01-29
    • 1970-01-01
    • 2018-10-23
    • 2023-01-22
    相关资源
    最近更新 更多