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

C# 要为字符串抛出什么异常类型,c#,.net,exception-handling,error-handling,C#,.net,Exception Handling,Error Handling,如果我有以下内容,对于任何检查为IsNullOrEmpty且结果为空的字符串,应该抛出什么样的异常类型,并且它不是方法的参数 我总是很难选择异常类型,因为它们太多了。这只是从web.config获取一个值,并检查SandboxSoapiUserName是否返回空 if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername)) throw new WTF do I throw here??? ahhh 这可能取决于使用

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

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

if(string.IsNullOrEmpty(ConfigUtility.SandboxSoapApiUsername))
        throw new WTF do I throw here??? ahhh
这可能取决于使用/上下文,对吗?我将使用返回的字符串设置一个类私有字段。因此,我需要在流程的早期而不是后期检查它是否为空字符串(而不是依赖其他代码来检查与我将设置ConfigUtility.SandboxSoapiUserName为的私有字段相关的属性)


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

这取决于字符串的来源。参数可能导致ArgumentNullException。配置可能会引发ConfigurationException(这似乎适用于这种情况)。或者您当然可以创建自己的。如果它作为参数传递,则抛出


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

在.NET framework中的方法通常区分
null
和为参数传入的无效值。我认为你应该提出一个论点​无效的​如果值为null且为参数,则出现异常​如果无效,则为异常

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");

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

 throw new InvalidConfigurationException("Must supply user name")

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

注意:不要使用System.Configuration.ConfigurationException。这是一个旧版本,已被弃用


注2:虽然我90%确定我们正在处理丢失的配置值,但如果它是丢失的方法参数,则抛出ArgumentExceptionArgumentOutOfRangeException,抛出
新的
异常时,您将真正花费大部分时间从下面的列表中选择(与简单地抛出
相反)

    • 发生配置系统错误时引发的异常
    • 当提供给方法的参数之一无效时引发的异常
    • 当方法调用对于对象的当前状态无效时引发的异常
  • 1)
    除非您从app.config或web.config中选择设置,否则这毫无意义:

    ConfigurationException异常 如果应用程序尝试 将数据读或写到 配置文件,但不可用 不成功的一些可能的原因 为此,可能会在中包含格式错误的XML 配置文件,文件 权限问题和配置 属性的值不是 有效

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

    3)
    这是三种方法中最好的一种,因为对象将处于无效状态。但是,根据您的配置设置集有多大,我更愿意创建自己的异常,该异常派生自
    System.Exception

    有两种思想流派可以从中衍生出来-
    System.Exception
    ApplicationException
    *。框架团队中两个不同的开发人员表达了不同的观点,他们认为您应该继承这些观点,我坚持

    如果以上这些听起来都像woffle,那么你可以选择一个你认为最相关的


    *看起来MSDN现在同意其框架开发人员的看法,即ApplicationException是一个设计错误

    没错,最好在代码中预期一个特定的异常,而不是一般的异常。该方法中的其他内容可能会抛出ArgNull或Arg异常…但该方法返回字符串。我猜这个方法仍然可以返回null,即使它的返回类型是string,如果你说在这个方法中有其他东西返回null?如果你抛出,那么它不会返回任何东西。这就是抛弃的意义是的,论点例外很容易。这不是参数异常,而是在将此类的某些属性设置为返回值之前检查方法返回的值。Intellisense没有将ConfigurationErrorsException作为异常选项提供给我,这就是为什么我提供了带命名空间的完全限定类型。使用System.Configuration.ConfigurationErrorsException,或导入/使用模块顶部的“System.Configuration”。那么,这是因为缺少配置?是的,配置错误感知是最好的选择。祝你好运