如果字符串为null,则抛出异常的一行

本文关键字:一行 抛出异常 字符串 null 如果 | 更新日期: 2023-09-27 18:21:59

我有一些web.config设置,我想确保这些设置始终存在。我想要一种巧妙的方法来做到这一点,比如为每个设置创建一个字段,在字段初始值设定项中,如果值为null,我会以某种方式抛出一个异常。

我最初的想法是使用三元运算符?:,但这需要两次写入同一个键。我不想重复密钥名称,因为这会使代码更加脆弱(如果我想重命名密钥,我需要在两个地方进行重命名)。有什么办法可以避免这种重复吗?

public class MyClass
{
    //what I don't really want (won't compile):
    private readonly string _name1 = ConfigurationManager.AppSettings["MyName"] != null
                                   ? ConfigurationManager.AppSettings["MyName"]
                                   : throw new Exception();
    //what I sort of want (won't compile):
    private readonly string _name2 = ConfigurationManager.AppSettings["MyName"]
                                   ?? throw new Exception();
    ...
}

如果字符串为null,则抛出异常的一行

这可能有点奇怪,但要跳出框框思考,您可以向类中添加一些方法(或作为静态方法),如:

public string ThrowConfigException(string message)
{
    throw new System.Configuration.ConfigurationErrorsException(message);
}

然后,您可以将属性添加到类中,如下所示:

private string _name1;
public string Name1
{
    get
    {
        return _name1 ?? (_name1 = ConfigurationManager.AppSettings["Name1"]) ?? ThrowConfigException("Name1 does not exist in the config file");
    }
}

C#7.0中的更新:您可以内联抛出异常。上面的例子现在可以写成:

private string _name1;
public string Name1
{
    get
    {
        return 
            _name1 ?? 
            (_name1 = ConfigurationManager.AppSettings["Name1"]) ?? 
            throw new System.Configuration.ConfigurationErrorsException(nameof(Name1) + " does not exist in the config file");
    }
}

您可以通过将逻辑分离到一个单独的(静态)方法中,并只为要测试的每个键调用该方法来减少大量重复代码。

public class MyClass
{
    private readonly string _name1 = GetConfigValue("MyName");
    private readonly string _name2 = GetConfigValue("AnotherSetting");
    private static string GetConfigValue(string settingName)
    {
        var setting = ConfigurationManager.AppSettings[settingName];
        if (setting == null)
            throw new Exception(string.Format("The setting {0} is missing.", settingName));
        return setting;
    }
}

您可以创建一个类型来用getter表示您的AppSettings和属性,getter只读取每个值一次。

public static class Settings
{
    private static string _myName;
    public static string MyName
    {
        get
        {
            if (_myName == null)
            {
                _myName = ConfigurationManager.AppSettings["MyName"];
            }
            if (_myName == null)
            {
                throw new Exception("AppSetting 'MyName' is not present in the application configuration file.");
            }
            return _myName;
        }
    }
}