C#我应该提出什么样的例外?

时间:2009-02-06 17:58:38

标签: c#

我目前正在试图找到一个属性是否已正确设置为bool值,它应该是这样的......

public void RunBusinessRule(MyCustomType customType)
{
    try
    {
       if (customType.CustomBoolProperty == true)
       {
            DoSomething(); 
       }
       else
       {
            throw new Exception("This is obviously false or possibly null lets throw up an error.");
       }
    }
    catch(Exception)
    {
        throw;
    }
}

现在为我抛出这个错误的处理是我正在使用微软的源代码分析它给我一个错误,说明“CA2201:Microsoft.Usage:Object.RunBusinessRule(MyCustomType)创建了一个'Exception'类型的异常,异常类型不够具体,不应该被用户代码引发。如果可能抛出此异常实例,请使用不同的异常类型。

Soooo我应该抛出什么异常,这对于Microsoft来说是特定的...,因为我自己的应用程序的逻辑处理错误,当我想“抛出”时。

13 个答案:

答案 0 :(得分:15)

ArgumentException
InvalidOperationException
FormatException

传递的论点并不好。

答案 1 :(得分:13)

你是否应该抛出异常?

具有错误的布尔值并不是特殊情况。

修改

我原来的答案有点简洁,所以我会详细说明......

从您的示例中,不清楚实际对象,属性和方法代表什么。如果没有这些信息,很难说出什么类型的例外(如果有的话)是合适的。

例如,我认为以下是对异常的完全有效使用(并且您的真实代码可能看起来像这样,但我们无法从您的示例中得知):

public void UpdateMyCustomType(MyCustomType customType)
{
    if (!customType.IsUpdateable)
        throw new InvalidOperationException("Object is not updateable.");

    // customType is updateable, so let's update it
}

但是在一般情况下,如果不了解您的域模型,我会说像这样的东西(假布尔值)并不是特别的。

答案 2 :(得分:12)

创建自己的例外Exception。例如:RuleViolationException

答案 3 :(得分:4)

ArgumentException也许?

也可以为InvalidOperationException提出一个案例。

答案 4 :(得分:2)

这里的答案是你不应该抛出任何异常。为什么抛出异常只是为了在一秒钟内再次捕获它并重新抛出它?

答案 5 :(得分:1)

稍微一点,但你可以稍微简化你的代码......

public void RunBusinessRule(MyCustomType customType)
{
    if (customType.CustomBoolProperty == false)
    {
        throw new Exception("This is obviously false or possibly null lets throw up an error.");
    }

    DoSomething(); 
}

至于要抛出的异常类型,您可以考虑ApplicationExceptionInvalidOperationException,或者您可以定义自己的异常类型。

答案 6 :(得分:1)

我知道一个问题是关于抛出异常,但我认为在这里做一个断言更合适:

// Precondition: customType.CustomBoolProperty == true
System.Diagnostics.Debug.Assert(customType.CustomBoolProperty)
DoSomething();

答案 7 :(得分:1)

InvalidArgument异常很好,但更好的是,一个ApplicationException。

答案 8 :(得分:1)

其他答案适合快速解决,但理想情况下,如果您在编译时知道某个方法永远不应使用某些参数调用,您可以通过继承自定义类型来防止这种情况发生,只有在自定义bool是真的,现在你的方法看起来像。

public void RunBusinessRule(MyInheritedType inheritedObject)
{
    //No need for checks, this is always the right type.
    //As a matter of fact, RunBusinessRule might even belong to MyInheritedType.
}

这是SOLID中的我。

答案 9 :(得分:1)

我认为你应该避免代码逻辑的异常。

我建议您修改方法以将方法的结果作为bool类型返回,然后您可以决定在调用方法时向用户显示错误消息的适当方法:

public bool RunBusinessRule(MyCustomType customType)
{
  try
    {
       if (customType.CustomBoolProperty == true)
       {
            DoSomething(); 
            return true;
       }

       return false;
    }
    catch(Exception)
    {
        throw;
    }
}

答案 10 :(得分:0)

通过扩展System.Exception并抛出它来创建自己的自定义异常。如果你愿意的话,你可以变得更加疯狂并拥有一整套异常类型。

答案 11 :(得分:0)

您可以创建仅用于业务逻辑验证的自定义ValidationException。或者,您可以为每种类型的验证错误创建单独的验证异常,尽管这可能是过载。

答案 12 :(得分:0)

不是你要求的,但是有很多人已经给出了我同意的答案,但是你也应该避免使用catch(Exception ex)。

尝试捕获首先可能的特定异常是一种更好的做法,如果需要,捕获通用的Expception。例如:

try{
   MyMethod(obj);
}catch (NullReferenceException ne){
   //do something
}
catch(UnauthorizedAccessException uae){
   //do something else
}
catch(System.IO.IOException ioe){
   //do something else
}
catch(Exception){
   //do something else
}