这是一个标准方案:
if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
throw new SomeStandardException("Application not configured correctly, bozo.");
问题是,我不能完全确定应该使用哪个异常
SomeStandardException
。我仔细研究了3.5 Framework,发现了两个可能的候选对象:
ConfigurationException
和 ConfigurationErrorsException
。实际上,此异常听起来很适合我的需要,但已被标记为过时,因此,ixthay on atthay。
这使我们进入了令人困惑的
ConfigurationErrorsException
:如您所见,其文档完全没有用。 (在本地和在线帮助中都是这样。)对类(class)本身的检查表明,这对于我想要的内容来说是过分的杀伤力。
简而言之,我需要一个标准异常,当应用程序配置设置丢失或包含无效值时应抛出该异常。您可能认为框架中有这样的异常供应用程序使用。 (它确实做到了,但被标记为过时,并被范围更大的东西所取代。)
你们有什么解决方案(如果有的话)用于此目的,我是否将不得不吸收它并为此提出自己的异常(exception)?
编辑附录
有人问我是否可以提供默认值,然后继续。在某些情况下,是的,在这些情况下,不会引发异常。但是,对于某些设置,这将不适用。例如:数据库服务器名称和凭据,身份验证服务器以及已安装的第三方应用程序的路径。
还值得注意的是,我主要处理的应用程序是以批处理模式运行的控制台应用程序,并且我希望它引发一个异常,该异常会被main方法捕获并在未正确配置的情况下正确记录。 (这是我继承的旧版代码,目前仅假设一切正常。)
最佳答案
您不仅可以将异常抛出限制为框架中的现有异常。如果您决定使用现有的异常(exception),则不必绝对遵循文档中的说明。该文档将描述框架如何使用给定的异常,但并不意味着您选择如何使用/重用现有异常。
它是您的应用程序-只要您对其进行记录并明确指出在缺少配置值的特定情况下将引发的异常,则可以使用任何您喜欢的异常。如果确实想要非常具体的指示缺失值,则可以考虑编写自己的ConfigurationSettingMissing异常:
[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}
编辑:在这种情况下编写您自己的异常会带来额外的好处,即可以确保不会对异常来自何处(框架或应用程序)造成任何混淆。该框架永远不会抛出您的自定义异常。
更新:我同意这些意见,因此我已将子类从Exception更改为ConfigurationErrorsException。我认为在可能的情况下,从现有Framework异常中继承自定义异常通常是一个好主意,避免使用Exception类,除非您需要特定于应用程序的异常。