c# - 很多 catch block ,但它们都具有相同的功能

标签 c# .net exception try-catch

如果我有这样的事情怎么办:

try
{
   //work
}
catch (ArgumentNullException e)
{
   HandleNullException();
   Logger.log("ArgumentNullException " + e);
   DoSomething();
}
catch (SomeOtherException e)
{
   HandleSomeOtherException();
   Logger.log("SomeOtherException " + e);
   DoSomething();
}
catch (Exception e)
{
   HandleException();
   Logger.log("Exception " + e);
   DoSomething();
}

现在我们可以看到,我正在尝试处理一些不同情况的异常。但是每当出现异常时,我总是在最后调用方法 DoSomething() 。如果出现异常,是否有更智能的方法来调用 DoSomething()?如果我添加了一个 finally block 并在那里调用了 DoSomething() ,它总是会被调用,即使没有异常。有什么建议吗?

最佳答案

If I added a finally block and called DoSomething() there, it would always be called, even when there is no exception.

您要查找的内容在 CLI standard 中已知(分区 IIA,第 18 章)作为 fault handler .尽管 .NET 实现了它们,但 C# 语言并不直接支持它们。但是,它们可以被模拟:

bool success = false;
try
{
    …
    success = true;
}
catch (…)
{
    …
}
…
finally
{
    if (!success)
    {
        DoSomething();
    }
}

请注意,没有必要在每个 catch 处理程序中设置标志,正如这里的一些答案所建议的那样。简单地否定测试,你只需要在 try block 的末尾设置一次标志。

关于c# - 很多 catch block ,但它们都具有相同的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298193/

相关文章:

c# - 什么是惰性实例化

c# - 如何确定实际物理网卡的 MAC 地址——而不是 VPN (.NET C#) 创建的虚拟网络接口(interface)

c# - DataGridView中如何使用Enter键作为Tab键

.net - 从MVC3升级到MVC4后“Element not closed”错误

.net - 用于异常处理的开源服务器应用程序?

c# - 如何在 C# 中将数据表插入到 Access 数据库中

asp.net - 无法加载程序集 : 'Microsoft.Practices.EnterpriseLibrary.Common'

c# - C# .NET 可以用于硬实时吗?

c# - 在 ASP.NET C# 中抛出异常

exception - Spinnaker Jenkins 集成无法从 Jenkins 获取作业