代码之家  ›  专栏  ›  技术社区  ›  Thorarin

类型初始值设定项(静态构造函数)异常处理

  •  11
  • Thorarin  · 技术社区  · 15 年前

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

    似乎静态构造函数只被调用一次,即使第一次(失败)尝试引发异常?任何随后的实例化类的尝试都将立即失败,并返回 TypeInitializationException 没有实际执行代码。

    C语言规范规定静态构造函数最多被调用一次,但基本上这是一个例外,即存在一个错误,即使您捕获了它,也无法从中恢复?

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Gus Paul    15 年前

    因此,可以将关键部分包装在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
             }
          } 
       }
    }
    
        2
  •  4
  •   Barry Kelly    15 年前

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

        3
  •  1
  •   Sklivvz    15 年前

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

    推荐文章