【问题标题】:.NET equivalent of Ruby's begin/rescue/else.NET 相当于 Ruby 的 begin/rescue/else
【发布时间】:2013-02-01 00:48:49
【问题描述】:

Ruby 有一个 else 块,可以进入 begin/rescue(.NET 人员的 try/catch)

begin
 #some code
rescue
 #oh noes! Catches errors like catch blocks in .NET
else
 #only executes when NO errors have occured
ensure
 #always executes - just like the finally in .NET
end

else 块中的代码只有在没有引发错误的情况下才会执行。 .NET 中是否有提供此功能的构造?

【问题讨论】:

  • 让我想起了On Error Move Next
  • 嵌套try/catch怎么样?
  • 我正在寻找开箱即用的东西,而无需构建任何东西。我可以通过一个方面轻松做到这一点,但我想知道是否有关键字。
  • else 块中的代码在#some 代码之后怎么样?如果#some code #only executes when NO errors have occured 中没有异常将执行。

标签: .net ruby


【解决方案1】:

在.NET中,你可以只列出#some code之后的代码:

try
{
   // some code
   // Only executes when NO errors have occurred
}
catch (Exception e)
{
    // Catches errors
}
finally
{
    // Always executes
}

// some code 中的任何异常都将阻止“仅执行”部分发生,因为它将跳转到 catch 然后 finally。

【讨论】:

  • 基本上您的回答是“仅当没有错误时”的特定关键字是不必要的,因此,.NET 中没有任何内容可以支持它。
  • @DustinDavis 是的。 .NET 异常处理的工作方式,不需要与标准代码块分开的“仅当没有错误时”块。
  • @DustinDavis 这在 ruby​​ 中也是如此 - else 唯一真正的“优势”是如果您期望总是会发生异常,就像 else块然后成为异常语句。在 .NET 中,指南规定异常只适用于特殊情况,因此拥有您总是期望异常的方法是不寻常的(充其量) - 这导致实际上不需要保证语言功能。
  • 用C#写的,如果// Only executes when NO errors..代码中出现异常会被下面的catch捕获——不知道如果对应的出现异常会发生什么Ruby 中的代码,但我怀疑不是同一件事 - 所以这可能不是完全等价的。
  • @MiMo True - 我相信它会在 Ruby 中冒泡
【解决方案2】:

关于异常处理的一些事情在其他语言中是可能的,但在 C# 中是不可能的。 fault handler 就是一个这样的例子——在 IL 中,可以定义一个仅在出现错误时才会触发的处理程序。

fault 似乎与您想要的相反,但您可以构建逻辑,以便某些代码仅在发生错误时执行,而不管您如何处理异常。 .NET 将为迭代器生成一个try..fault 块。 Bart De Smet 曾经挑战他博客的读者尝试模拟故障处理程序,您可以阅读更多关于它的信息here。

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多