这两个例外中的哪一个被称为?

时间:2010-05-17 14:51:18

标签: c# .net asp.net exception-handling

如果我有一个可以在两个地方抛出ArgumentException的例程,比如......

if (Var1 == null)
{
    throw new ArgumentException ("Var1 is null, this cannot be!");
}

if (Val2  == null)
{
    throw new ArgumentException ("Var2 is null, this cannot be either!");
}

在我的调用过程中确定抛出两个异常中的哪一个的最佳方法是什么?

我是以错误的方式做这件事吗?

10 个答案:

答案 0 :(得分:12)

对于此特定方案,您应该使用ArgumentNullException并正确填充它的ParamName属性,以便您知道该参数为null。

ArgumentException也支持相同的属性,但您应该使用最具体的异常类型。

使用这些类型的异常时,在使用同时接受消息和参数名称的构造函数时也要小心。订单在每种例外类型之间切换:

throw new ArgumentException("message", "paramName");

throw new ArgumentNullException("paramName", "message");

答案 1 :(得分:11)

将第二个参数中的变量名称(Val1,Val2等)传递给ArgumentException构造函数。这将成为ArgumentException.ParamName属性。

答案 2 :(得分:4)

您的调用函数不应该关心导致异常的行。在任何一种情况下都会抛出ArgumentException,并且两者都应以相同的方式处理。

答案 3 :(得分:3)

使用构造函数ArgumentException(string, string)来定义哪个参数为null。

if (Var1 == null) {
  throw new ArgumentException ("Var1 is null, this cannot be!","Var1");
}

if (Val2  == null){
  throw new ArgumentException ("Var2 is null, this cannot be either!","Var2");
}

答案 4 :(得分:3)

你应该问自己更大的问题是为什么?如果你试图从中驱动某种逻辑,那么异常通常是一种不好的方式。

相反,你应该有一个返回类型(或out / ref参数),它将设置一个你可以从调用代码中检测到的某种类型的标志/值来确定错误是什么并驱动你的逻辑

如果您坚持使用例外,那么在这种情况下,ArgumentNullException has a constructor that takes the name of the parameter and the exception message。您可以抛出异常,然后在捕获异常时,访问ParamName property以确定导致异常的参数名称。

答案 5 :(得分:3)

您实际上没有提供足够的信息来回答您的问题。显而易见的答案是查看异常的消息,但我猜这不是你想要的。

如果能够以编程方式区分它们是非常重要的,那么请使用另一个异常,或者至少使用当前异常构造函数的paramName属性。这将为您提供更多相关信息。

但是,使用您自己的异常类型是保证您捕获特定情况的例外的唯一方法。因为ArgumentException是框架的一部分,所以你调用的其他内容可能会抛出它,这会导致你进入同一个catch块。如果您创建自己的异常类型(两者都有一个或每个场景都有一个),这将为您提供一种处理特定错误的方法。当然,根据您的示例判断,在调用函数开始之前,检查并查看Val1Val2是否为null似乎更简单。

答案 6 :(得分:2)

好吧,特别是对于ArgumentException,你有一个参数,哪个参数有问题:

throw new ArgumentException("Var1 is null, this cannot be!", "Var1");

在更一般的意义上,你通常会做一些事情,比如使用不同的(可能是自定义的)异常类型,然后调用代码可以有不同的catch块

public class MyCustomException1 : ApplicationException {}
public class MyCustomException2 : ApplicationException {}


try
{
 DoSomething();
}
catch(MyCustomException1 mce1)
{
}
catch(MyCustomException2 mce2)
{
}
catch(Exception ex)
{
}

答案 7 :(得分:0)

try
        {
            //code here
        }
        catch (ArgumentException ae)
        {
            Console.WriteLine(ae.ToString());
        }

控制台中的输出将告诉您放置的信息。

答案 8 :(得分:0)

投掷ArgumentExceptions时,您始终可以包含导致异常的参数名称(another constructor)。当然我假设你真的想知道哪一个是null,在这种情况下,你应该使用ArgumentNullException

答案 9 :(得分:0)

如果这是针对您要确保显示正确的异常消息的测试用例,我知道NUnit对ExpectedException属性有一个ExpectedMessage关键字。否则,ArgumentNullExceptionArgumentNullException,您的应用程序应该对它们进行相同处理。如果您想了解更多细节,请创建自己的异常类并使用它们。

所以你可以测试以下内容:

[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Var1 is null, this cannot be!"]
public void TestCaseOne {
    ...
}

[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Var2 is null, this cannot be either!"]
public void TestCaseTwo {
    ...
}