如果字符串为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();
...
}
这可能有点奇怪,但要跳出框框思考,您可以向类中添加一些方法(或作为静态方法),如:
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;
}
}
}