Possible syntax for multi-type catch blocks in C#?
以下是关于此主题的前两个问题:
- 一次捕获多个异常?
- 比多个catch块更优雅的异常处理?
我今天正在工作,我认为如果将此功能添加到C语言中,这可能是一个合适的语法。有人对此有什么看法吗?
e的类型必须是列出的每个异常类型的基类型或接口。
编辑:在本例中,catch块处理ArgumentNullException或ArgumentOutOfRangeException并将异常实例放在名为e的ArgumentException类型的变量中。它不处理除所列两种以外的任何其他类型的ArgumentException。我认为关于,和as的结合性有些混淆。
编辑2:如果列出的异常都向上转换为e类型的变量,那么代码将干净地编译为msil,而不进行任何转换或显式类型检查,从而使其比当前捕获ArgumentException的语法更快(可能显著),如果不是您想要的两个语法之一,则后面紧跟throw;。如果你正在抓取Exception,并检查两种可能的类型来处理,如果是其他的类型,问题就更明显了。
1 2 3 4 5 6
| try
{
}
catch (ArgumentNullException, ArgumentOutOfRangeException as ArgumentException e)
{
} |
- 投反对票的人能说出他们为什么投反对票吗?
- 唯一的问题是"有人对此有什么看法吗?"答案是:"是的,我们大多数人都是非常固执己见的人。"或者问一个"真实"的问题,或者问GTFO。
- 另一种,功能性风格:嗯,不是很干净(像你和这里的许多其他建议),但这是可行的。
看到这个:酷还是笨?catch(异常[NamingException,CreateException]e)
我对这个问题的回答是,它们应该让您像使用块一样"堆叠"它们:
1 2 3 4 5 6 7 8 9
| try
{
}
catch (ArgumentNullException e)
catch (ArgumentOutOfRangeException e)
catch (ArgumentException e)
{
} |
尽管我看到你要去,而不是去。就我个人而言,我不认为and方法非常有用,因为您已经被限制为真正的非接口异常类型,并且没有双重继承。
- 我喜欢这个方法,因为它酷似CASE语句如何栈。只要是确定的编码类型,并在catch块的成本。
- 检查我的两个编辑的地址,加上本不e是什么类型的问题。
- 我认为这会工作,但变量可能会在参数名称不唯一。
- 乔尔:乔恩@ @,然后你可以检查每一个null结束。一个矿,你可以使用代码没有检查casts因为你知道e是一个非零的值ArgumentException型。这是一个巨大的差分条件代码的清晰度。因此,注意,我异常的catch块不做更多的ArgumentException通用型的,它只是一个declares e型和自认为是ArgumentNullExceptionArgumentOutOfRangeException铸造。
- "280z28:本案例,最后catch线将作为一个基地,这是A型父母以前的所有类型。
- "280z28:现在我想它会为给定的语法,允许的工作人员,每个变量分别定义异常(E)的2和1的F)。简单的编译器会做它检查每个类型这是被在相同的变量。
为Java 7设计包含以下功能的语法如下:
1 2 3 4 5
| try {
return klass .newInstance();
} catch (InstantiationException | IllegalAccessException e ) {
throw new AssertionError (e );
} |
编辑:我认为目的是让静态类型的e成为列出的异常中最具体的通用超类。(在Java中,只有Java.Lang.Supable类的实例可以被抛出,因此使用普通超级接口捕获的效用很有限,因为异常不能被重新抛出。)
- 这是不建议,因为它不定义的小学期的地址给一个变量的静态类型e有效。处理异常的列表(用我的邮件中建议由,和Java的|)应单独从异常类型变量的声明。一个单独的as矿山使用两部分。建议可以使用Java as,或也许是catch (InstantiationException | IllegalAccessException : VariableType e)酒店要求的例外列表中的每个类型的一个VariableType浇注料。
如果ArgumentNullException和ArgumentOutOfRangeException有不同的接口,将是正确铸造的痛苦;
例如,ArgumentOutOfRangeException有一个ActualValue属性;如果你不得不使用它,你将以如下方式结束:
1 2 3 4 5 6 7 8
| if(e is ArgumentOutOfRangeException )
{
// use e.ActualValue
}
else
{
// use e.Data
} |
- 这是在所有情况下最或catch块中的代码是为每个共享的处理异常的类型。
你已经可以这样做了,只是
1 2 3
| try{}
catch(Exception e)
{} |
因为所有异常都源自System.Exception。您可以像上面所做的那样,确定catch块本身中异常的类型。
- 这是一个可行的本特征的漆,特别是和它的链接添加了我。一加一地址编辑2个以上专业语言的语法,这增加的福利院的用例。
- 现在wokrarounds工作多长时间,你要等的语言特征是增值?如果你想有它?
- 但那不是点这个问题。我已经知道如何处理的情况,什么是可用的。在语言进化的时间特性,以在与什么人来了。这将可能永远不会发生的(有一个非常低的统计特征的接受率),但至少我想关于它的东西。:)
我不认为自己经常在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列表中的位置远远高于此:)
- 这不处理所有ArgumentExceptions,只有两列。在as ArgumentException eeA型,这是保证每一个可能的例外是兼容,这是一块被抓的把手。
- 你编辑的问题,或我只是想念它?我可以有宣誓它只是前三列异常。编辑:啊。)
- 我没有编辑的代码,但我添加两段,解释为什么这可能是更好的比的电流。有一些API(这是ASP.NET?)这需要许多不同类型的异常处理异常处理程序和我见过的编码冗余和没有得到非常,非常简单的方式来改善它。
- 这是唯一可能的,如果你要想把一个包或例外,只是让propagate例外。
只有在不声明实例(e)的情况下,这才有效。如果你引用块内的e,它是什么?
- e显然是在ArgumentException,因为我必须说它的类型或接口类型A库(每一列是否异常。在catch块将不处理任何ArgumentExceptionArgumentNullException和ArgumentOutOfRangeException比其他。我问这个问题,因为这是我和你提到的语法问题。