类型初始化(静态构造函数)的异常处理(Type initializer (static constr

2019-07-03 16:32发布

我正在写在C#中的WCF服务。 起初我实现了一个静态构造函数做一些一次性初始化,但一些正在做可能(暂时)失败的初始化。

看来,静态构造函数只被调用一次,即使第一(失败)的尝试抛出一个异常? 任何后续尝试实例化我的课将立即失败,并TypeInitializationException ,而又没有实际执行的代码。

C#语言规范指出,静态构造函数被调用最多一次,但基本上这使得在那里,你永远不能从恢复的错误例外,即使你抓住了吗?

我失去了一些东西在这里? 我想我应该搬到任何远程危险到服务的实例构造和手动检查是否将类的初始化已经成功地完成了前面?

Answer 1:

所以,你可以包装在try / catch语句和至少关键部分,这意味着该类型不会无法完成初始化,但肯定如果初始化代码是至关重要的,那么这种行为实际上是不错的 - 类型不在此初始化可用州。

另一种选择是做一个单身 - 每次尝试并获得例如,您可以正确地创建类型,直到你成功的时候,即使它失败的第一次。

你仍然需要一些错误处理,以防万一实例将返回空的第一个(或第二等)时,主叫方。

编辑:如果你不想单身,那么只需要你的构造函数初始化静态部分

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

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


Answer 2:

这里的教训是非常简单的:不要做一个静态构造函数,可以合理地失败的事情。



Answer 3:

我在过去使用的解决方法是创建一个Singleton。 做一个静态构造函数失败,当且仅当失败意味着整个应用程序无法运行。



文章来源: Type initializer (static constructor) exception handling