C# 试一试。以相同的方式处理多个异常(或使用故障排除)

C# 试一试。以相同的方式处理多个异常(或使用故障排除),c#,exception,exception-handling,error-handling,C#,Exception,Exception Handling,Error Handling,已经发布了一个非常类似的问题。我的问题更进一步。假设您希望捕获多种类型的异常,但希望以相同的方式处理它,有没有一种方法可以像switch case这样做 switch (case) { case 1: case 2: DoSomething(); break; case 3: DoSomethingElse() break; } 可以用同样的方法处理少数异常吗。差不多 try { } catch (CustomException ce) catch (Anoth

已经发布了一个非常类似的问题。我的问题更进一步。假设您希望捕获多种类型的异常,但希望以相同的方式处理它,有没有一种方法可以像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
}

目前还没有语言结构来完成你想要的。除非异常都来自基异常,否则您需要考虑将公共逻辑重构为方法,并从不同的异常处理程序调用它。 或者,您可以按照此问题中的说明进行操作:


就我个人而言,我倾向于使用基于方法的方法。

你真的应该有一个BaseCustomException并捕获它。

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

我从来没有真正做过这样或类似的事情,我没有权限访问编译器进行测试,但这样的东西肯定会有用。不确定实际如何进行类型比较,或者C#是否允许您用case语句替换if语句

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;
  }
}

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

Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException 当TypeOf Ex是this异常或TypeOf Ex是that异常时,Catch Ex作为异常 不幸的是,无论出于何种原因,C#的实现者至今仍拒绝允许在C#中编写异常过滤代码。

这是,但我将代码拉到这个线程:

捕捉
系统异常
并打开类型

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

    throw;
}

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

这可能会起作用,但这不是一个好的解决方案,因为它忽略了两个非常基本的事实:a)有一个基本的系统异常类,您不需要一直到system.Object;和b)针对不同异常类的多个catch语句就是为了这个目的而存在的。我同意Allison R关于(a)点的观点,但关于(b)点,对于回答所提出的问题似乎是批评。将通用功能分解成一个方法,并在各种
catch()中调用它
blocks是一种更优雅的方式,因为它不需要类型检查,并且正确地使用本机语言构造进行异常处理。旁注:最后的“throw obj;”应该是类似于“throw;”或“throw new footexception”(“blablabla”,obj);”我想我可能也应该添加一个理由来说明:为了在“obj”中保留stacktrace:)可能的重复项将数据复制到此线程:
catch(Exception ex){if(ex是FormatException | | ex是OverflowException){WebId=Guid.Empty;return;}throw;}
为什么不呢?try-catch块中可能有3个有效的自定义库。您是对的,一般来说,捕获所需数量的自定义异常非常好,事实上,如果您以不同方式处理它们,这是首选。