【问题标题】:try- catch. Handling multiple exceptions the same way (or with a fall through)试着抓。以相同的方式(或失败)处理多个异常
【发布时间】:2011-01-18 11:35:33
【问题描述】:

已经发布了一个问题here 非常相似。我的进一步扩展了这个问题。假设您想捕获多种类型的异常但想以相同的方式处理它,有没有办法做类似 switch case 的事情?

switch (case)
{
  case 1:
  case 2:

  DoSomething();
  break;
  case 3:
  DoSomethingElse()
  break;

}

是否有可能以同样的方式处理少数异常。类似的东西

try
{
}
catch (CustomException ce)
catch (AnotherCustomException ce)
{
  //basically do the same thing for these 2 kinds of exception
  LogException();
}
catch (SomeOtherException ex)
{
 //Do Something else
}

【问题讨论】:

标签: c# exception exception-handling error-handling


【解决方案1】:

目前没有语言结构可以完成你想要的。除非异常都源自基本异常,否则您需要考虑将通用逻辑重构为方法并从不同的异常处理程序中调用它。

或者,您可以按照此问题中的说明进行操作:

Catch multiple Exceptions at once?

我个人更喜欢基于方法的方法。

【讨论】:

  • 复制数据到这个线程:catch (Exception ex) { if (ex is FormatException || ex is OverflowException) { WebId = Guid.Empty; return; } throw; }
【解决方案2】:

你真的应该有一个 BaseCustomException 并抓住它。

【讨论】:

    【解决方案3】:

    这是copied from another posting,但我将代码拉到这个线程:

    捕捉System.Exception并打开类型

    catch (Exception ex)            
    {                
        if (ex is FormatException || ex is OverflowException)
        {
            WebId = Guid.Empty;
            return;
        }
    
        throw;
    }
    

    我更喜欢在几个 catch 块中重复一个方法调用。

    【讨论】:

      【解决方案4】:

      在vb.net中,可以使用异常过滤器来表示,例如

      当 Ex 类型为 ThisException 或 Ex 类型为 ThatException 时将 Ex 捕获为异常

      不幸的是,无论出于何种原因,C# 的实现者都拒绝允许在 C# 中编写异常过滤代码。

      【讨论】:

        【解决方案5】:

        您不应该捕获这么多自定义异常,但是如果您愿意,您可以创建一个通用的 BaseException 并捕获它。

        【讨论】:

        • 为什么不呢?在 try catch 块中可能有 3 个有效的自定义库。
        • 你是对的,一般来说,捕获尽可能多的自定义异常是非常好的,如果你以不同的方式处理它们,它实际上是首选。
        【解决方案6】:

        我从来没有真正做过这个或类似的事情,我也没有为测试目的而使用编译器,但这样的事情肯定会起作用。不确定如何实际进行类型比较,或者 C# 是否允许您将 if 语句替换为 case 语句。

        try 
        { 
        }
        catch (System.Object obj)
        {
          Type type;
        
          type = obj.GetType() ;
          if (type == CustomException || type == AnotherCustomException)
          { 
            //basically do the same thing for these 2 kinds of exception 
            LogException(); 
          } 
          else if  (type == SomeOtherException ex) 
          { 
            //Do Something else 
          }
          else
          {
            // Wasn't an exception to handle here
            throw obj;
          }
        }
        

        【讨论】:

        • 这可能行得通,但这不是一个好的解决方案,因为它忽略了两个非常基本的事实:a) 有一个基础系统异常类,你不需要一直走下去到 System.Object; b) 为此目的,存在针对不同异常类的多个 catch 语句。
        • 我同意 Allison R 关于 (a) 点的观点,但就 (b) 点而言,这似乎是对回答所提问题的批评。
        • 将通用功能分解为一个方法并在各种 catch() 块中调用它是更优雅的方法,因为它不需要类型检查,并且可以正确使用本地语言结构异常处理。
        • 旁注:“throw obj;”最后最好还是像“扔”这样的东西;或“抛出新的 FooException(“blabla”,obj);”我猜
        • 我可能也应该添加一个声明的理由:将堆栈跟踪保留在 'obj' 中:)
        猜你喜欢
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 2010-12-14
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多