C#中多类型catch块的可能语法?

Possible syntax for multi-type catch blocks in C#?

以下是关于此主题的前两个问题:

  • 一次捕获多个异常?
  • 比多个catch块更优雅的异常处理?

我今天正在工作,我认为如果将此功能添加到C语言中,这可能是一个合适的语法。有人对此有什么看法吗?

e的类型必须是列出的每个异常类型的基类型或接口。

编辑:在本例中,catch块处理ArgumentNullExceptionArgumentOutOfRangeException并将异常实例放在名为eArgumentException类型的变量中。它不处理除所列两种以外的任何其他类型的ArgumentException。我认为关于,as的结合性有些混淆。

编辑2:如果列出的异常都向上转换为e类型的变量,那么代码将干净地编译为msil,而不进行任何转换或显式类型检查,从而使其比当前捕获ArgumentException的语法更快(可能显著),如果不是您想要的两个语法之一,则后面紧跟throw;。如果你正在抓取Exception,并检查两种可能的类型来处理,如果是其他的类型,问题就更明显了。

1
2
3
4
5
6
try
{
}
catch (ArgumentNullException, ArgumentOutOfRangeException as ArgumentException e)
{
}


看到这个:酷还是笨?catch(异常[NamingException,CreateException]e)

我对这个问题的回答是,它们应该让您像使用块一样"堆叠"它们:

1
2
3
4
5
6
7
8
9
try
{
}
catch (ArgumentNullException e)
catch (ArgumentOutOfRangeException e)
catch (ArgumentException e)
{

}

尽管我看到你要去,而不是去。就我个人而言,我不认为and方法非常有用,因为您已经被限制为真正的非接口异常类型,并且没有双重继承。


为Java 7设计包含以下功能的语法如下:

1
2
3
4
5
try {  
    return klass.newInstance();  
} catch (InstantiationException | IllegalAccessException e) {  
    throw new AssertionError(e);  
}

编辑:我认为目的是让静态类型的e成为列出的异常中最具体的通用超类。(在Java中,只有Java.Lang.Supable类的实例可以被抛出,因此使用普通超级接口捕获的效用很有限,因为异常不能被重新抛出。)


如果ArgumentNullExceptionArgumentOutOfRangeException有不同的接口,将是正确铸造的痛苦;

例如,ArgumentOutOfRangeException有一个ActualValue属性;如果你不得不使用它,你将以如下方式结束:

1
2
3
4
5
6
7
8
if(e is ArgumentOutOfRangeException)
{
    // use e.ActualValue
}
else
{
    // use e.Data
}


你已经可以这样做了,只是

1
2
3
 try{}
 catch(Exception e)
 {}

因为所有异常都源自System.Exception。您可以像上面所做的那样,确定catch块本身中异常的类型。


我不认为自己经常在C语言中这样想,而在Java中,我发现有很多情况下,我必须捕获一组检查异常并将它们包在我声明的方法抛出的异常中。

这是我想要的一些语法:

1
2
3
4
5
6
7
8
try
{
}
wrap (OneException as AnotherException)
catch (HandleableException e)
{
    // Actual handling for some exception types
}

…但是再一次,我发现自己在Java中做的比C语言多。

还有一些其他的增强功能,它们在我的C列表中的位置远远高于此:)


只有在不声明实例(e)的情况下,这才有效。如果你引用块内的e,它是什么?