键入初始化程序(静态构造函数)异常处理

Tho*_*rin 11 .net c# exception static-constructor

我正在用C#编写WCF服务.最初我的实现有一个静态构造函数来进行一次性初始化,但是正在进行的一些初始化可能(暂时)失败.

看起来静态构造函数只调用一次,即使第一次(失败)尝试引发了异常?任何后续尝试实例化我的类都将立即失败,并且TypeInitializationException没有实际执行的代码.

C#语言规范声明静态构造函数最多被调用一次,但基本上这会产生一个异常,即使你抓住它也无法从中恢复?

我在这里错过了什么吗?我想我应该向服务的实例构造函数移动任何远程危险的东西,并手动检查类初始化是否已经成功完成了之前?

Gus*_*aul 4

因此,您可以将关键部分包装在 try/catch 中,至少这意味着该类型不会初始化失败,但如果初始化代码如此关键,那么这种行为实际上是好的 - 该类型在未初始化的情况下不可用状态。

另一种选择是将其作为单例进行 - 每次尝试获取实例时,您都可以正确创建类型,直到成功,即使第一次失败。

如果 Instance 第一次(或第二次等)返回 null,您仍然需要对调用者进行一些错误处理。

编辑:如果您不需要单例,那么只需让实例构造函数初始化静态部分

例如

private object _lock = new object()
private bool _initialized;

public T()
{
   lock(_lock)
   {
      if(!_initialized)
      {
         try
         {
           //Do static stuff here
         }
         catch(Exception ex_)
         {
           //Handle exception
         }
      } 
   }
}
Run Code Online (Sandbox Code Playgroud)