关于c#:try-catch。

try- catch. Handling multiple exceptions the same way (or with a fall through)

这里已经发布了一个非常相似的问题。我的问题更进一步了。假设您希望捕获多种类型的异常,但希望以相同的方式处理它,是否有一种方法可以执行类似switch case的操作?

1
2
3
4
5
6
7
8
9
10
11
12
switch (case)
{
  case 1:
  case 2:

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

}

是否可以用同样的方法处理少数例外情况?类似的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
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并捕获它。


这是从另一个发布中复制的,但我正在将代码拖到这个线程中:

抓到System.Exception并打开类型

1
2
3
4
5
6
7
8
9
10
catch (Exception ex)            
{                
    if (ex is FormatException || ex is OverflowException)
    {
        WebId = Guid.Empty;
        return;
    }

    throw;
}

比起在几个catch块中重复方法调用,我更喜欢这样。


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

1
  Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException

不幸的是,无论出于什么原因,C的实现者至今拒绝允许在C中写入异常过滤代码。


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
  }
}