c – 如何在初始化静态成员时捕获抛出的异常

我有一个静态成员的类:

class MyClass
{
public:
    static const SomeOtherClass myVariable;
};

我在CPP文件中初始化如下:

const SomeOtherClass MyClass::myVariable(SomeFunction());

问题是,SomeFunction()从注册表中读取一个值.如果该注册表项不存在,则会引发异常.这导致我的程序爆炸而没有给用户任何有用的输出…是否有某些方法我可以捕获异常,所以我可以记录它?

最佳答案
我不太喜欢静态数据成员,初始化的问题是最重要的.

每当我必须进行重要处理时,我作弊并使用本地静态代替:

class MyClass
{
public:
    static const SomeOtherClass& myVariable();
};

const SomeOtherClass& MyClass::myVariable()
{
  static const SomeOtherClass MyVariable(someOtherFunction());
  return MyVariable;
}

这样,异常只会在第一次使用时抛出,但对象将是const.

这是延迟执行的非常强大的习惯用语.它有一点开销(基本上编译器每次进入方法时都会检查一个标志),但最好先担心正确性;)

如果从多个线程调用它:

>如果您的编译器处理它,很好
>如果您的编译器没有,您可以使用本地线程存储(无论如何都是const)
>你可以在Boost.Threads库中使用boost :: once
>因为它是const,你可能不关心它是否多次初始化,除非someOtherFunction不支持并行执行(注意资源)

准则:仅对简单对象(不能抛出)使用静态或全局变量实例化,否则使用本地静态变量来延迟执行,直到您可以捕获结果异常.

转载注明原文:c – 如何在初始化静态成员时捕获抛出的异常 - 代码日志