首页 文章

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

提问于
浏览
11

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

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

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

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

3 回答

  • 3

    因此,您可以将关键部分包装在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
             }
          } 
       }
    }
    
  • 4

    这里的教训很简单:不要在静态构造函数中做任何可能合理失败的事情 .

  • 1

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

相关问题