如何捕获配置绑定异常?

时间:2019-07-10 15:38:09

标签: c# .net exception .net-core configuration

我正在.NET Core 2.2中构建控制台应用程序。

我添加了如下的强类型配置:

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();

services.Configure<AppConfiguration>(configuration);

我的配置绑定到类AppConfiguration的对象上。我想知道,如何捕获将配置值绑定到类时可能发生的异常?例如,我的配置属性之一是枚举。如果用户提供了不存在的参数,则堆栈跟踪会出现异常:

  

at System.Enum.TryParseEnum(Type enumType,String value,Boolean   System.Enum.Parse(Type)上的ignoreCase,EnumResult&parseResult)   enumType,字符串值,布尔值ignoreCase),位于   System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext   上下文,CultureInfo文化,对象值)

基本上,我需要某种方式来知道该异常是由于错误的配置而不是其他问题而发生的。如果我能够捕获任何与配置绑定相关的异常,则可以抛出自己的WrongConfigurationException来捕获它,并确保config出现问题。

1 个答案:

答案 0 :(得分:1)

通过从配置中急切获取/绑定所需对象并捕获启动期间引发的任何异常来尽早失败。

引用Bind to an object graph

//...

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();

try {
    //bind to object graph
    AppConfiguration appConfig = configuration.Get<AppConfiguration>();

    //custom validation can be done here as well
    //...        

    //if valid add to service collection.
    services.AddSingleton(appConfig);    
} catch(Exception ex) {
    throw new WrongConfigurationException("my message here", ex);
}

//...

请注意,在上面的示例中,可以将类显式注入到依赖项中,而不必将其包装在IOptions<T>, which has its own design implications

也可以通过仅使try-catch失败而放弃它。

//...

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", true)
    .AddCommandLine(args)
    .Build();


//bind to object graph
AppConfiguration appConfig = configuration.Get<AppConfiguration>();

//custom validation can be done here as well
if(/*conditional appConfig*/)
    throw new WrongConfigurationException("my message here");

//if valid add to service collection.
services.AddSingleton(appConfig);    

//...

它应该轻松指出引发异常的位置和原因。