为字符串抛出什么异常类型

时间:2010-01-19 19:06:58

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

如果我有以下内容,实际上对于任何检查IsNullOrEmpty的字符串并且它变为空,应该抛出什么样的异常类型,它不是方法的参数

我总是很难选择异常类型,因为它们中有很多很多。这只是从web.config获取一个值并检查SandboxSoapApiUsername是否返回空。

if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
        throw new WTF do I throw here??? ahhh

可能取决于使用/上下文对吗?好吧,我将使用返回的字符串来设置类私有字段。所以我需要在过程的早期检查它是否为空字符串而不是以后(而不是依赖其他代码来检查与私有字段相关的属性,我将设置ConfigUtility.SandboxSoapApiUsername)。

由于我将每个ConfigUtility.MEthodName设置为此类的属性将在SOAP请求中使用,我认为UriFormatException可能在这里适用,即使这不是Uri吗?

6 个答案:

答案 0 :(得分:11)

.NET Framework中的方法通常区分null和为参数传入的无效值。我认为如果值为null,则应抛出Argument Null Exception,如果无效则抛出Argument Exception。

if (arg == null)
    throw new ArgumentNullException("arg", "argcannot be null");
if (arg == string.Empty)
    throw new ArgumentException("arg cannot be an empty string", "arg");

如果该值不是参数,但是,例如,在初始化期间加载,我认为无效的操作异常是合适的:

if (string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
    throw new InvalidOperationException("Cannot initialize because " +
                                        "SandboxSoapApiUsername not configured");

答案 1 :(得分:10)

这取决于字符串来自何处。参数可能会导致ArgumentNullException。配置可能会抛出ConfigurationException(这似乎适用于这种情况)。或者你当然可以创建自己的。

答案 2 :(得分:5)

在抛出new例外(而不是简单地执行throw)时,您将花费大部分时间从下面的列表中挑选。

  1. ConfigurationException
    • 发生配置系统错误时引发的异常。
  2. ArgumentException
    • 提供给方法的其中一个参数无效时引发的异常。
  3. InvalidOperationException
    • 当方法调用对象的当前状态无效时引发的异常。
  4. 1)
    除非您从app.config或web.config中选择设置,否则这可能没有意义:

      

    ConfigurationException异常   如果应用程序尝试,则抛出   读取或写入数据   配置文件但是   不成功。一些可能的原因   为此,可能包括格式错误的XML   配置文件,文件   权限问题和配置   值不是的属性   有效的。

    2)
    这不是一个论据所以这个没有多大意义。

    3)
    这是三者中最好的,因为对象将处于无效状态。但是,根据您的配置设置的大小,我更愿意从System.Exception派生自己的异常。

    有两种思想流派来自 - System.ExceptionApplicationException *。框架团队中的两个不同的开发人员表达了他们认为你应该继承的不同观点,我坚持Jeffrey Richter's view

    如果上述所有内容听起来像woffle,那么你可以选择一个你认为与the list最相关的一个。

    *看起来MSDN现在同意其框架开发者ApplicationException是一个设计错误

答案 3 :(得分:4)

您需要一个InvalidConfiguration异常 - 定义一个

 throw new InvalidConfigurationException("Must supply user name")

答案 4 :(得分:1)

如果它作为参数传递,则抛出ArgumentNullException

否则,它实际上取决于应用程序上下文中null字符串的含义。如果场景的基础框架中没有内容,请不要害怕定义自定义异常类型。

答案 5 :(得分:0)

由于似乎没有正确配置,我建议 System.Configuration.ConfigurationErrorsException

注意:请勿使用 System.Configuration.ConfigurationException 。它是旧版本,已被弃用。

注意2:虽然我90%确定我们正在处理缺少的配置值,但如果它是缺少的方法参数,则抛出 ArgumentException ArgumentOutOfRangeException