我正在移植视C++应用到海湾合作委员会(应该建立在MingW和Linux)。

现有的代码使用 __try { ... } __except(1) { ... } 在几个地方所以几乎什么也没有(很短的可能内存类型的错误?) 将使退出程序没有做一些最起码的记录。

有什么选择做的事情相似的与海湾合作委员会?

编辑:谢谢你的指针/EH选择在Visual Studio,我现在需要的是一些例子如何处理信号在Linux。我已经找到了 这个消息 从2002年。

什么其他的信号不管 SIGFPESIGSEVG 我应该看出来的?(主要是关心那些可能提出自 做错了什么)

赏金的信息:我想我应用程序,以便能够自我的日志作为许多错误的条件下尽可能在它之前退出。

什么信号也许我和其中一般将无法记录一个错误消息?(出去的记忆,还有什么?)

我可以如何处理例外情况以及(最重要的是)信号在一个便携式的方式,代码至少工作一样在Linux和MingW.#ifdef是确定。

原因我不只有一个包装过程记录的失败是,对于业绩原因,我保存写一些数据的磁盘直到最后一分钟,所以如果出了什么差错我要让所有可能的尝试写入数据之前退出。

有帮助吗?

解决方案

试试{xxx}赶(...){xxx}将更多的便携式,但不可能抓到一样多。它取决于编译器的设置和环境。

使用的默认VC++设置、异步(她)错误未交付给C++是基础设施;要追上他们需要利用她的处理程序(__尝试/__除外)。VC++让你给路线SEH错误通C++的错误处理,它允许一个赶上(...)陷阱SEH错误;这包括存储器中的错误,如空指针,取消引用的. 详细信息.

在Linux上,然而,许多错误Windows用SEH为表示过的信号。这些都不是没有抓到过尝试/赶上;来处理他们你需要一个信号处理程序。

其他提示

为什么没有使用C++标准的例外情况,而不是微软的专有的扩展?C++有一个例外处理的理念。

struct my_exception_type : public logic_error {
    my_exception_type(char const* msg) : logic_error(msg) { }
};

try {
    throw my_exception_type("An error occurred");
} catch (my_exception_type& ex) {
    cerr << ex.what << endl;
}

C++还有一个"包罗万象"条款,所以如果你想要登录例外情况可以用下面的包装:

try {
    // …
}
catch (...) {
}

然而,这并不是非常有效C++因为创建这样的一般包装物意味着处理代码已被插在 随后堆框架的编译器(不同于在管理系统等。净在例外处理是在不增加额外费用只要不例外实际上是扔).

为了便于携带,有一件事要尝试是采用试试-抓住块,用于大多数香草的例外再设置一个终止处理程序(set_terminate_handler)有一个最小的挂钩可用于灾难性的出口条件。你也可以试试加点像一个atexit或on_exit处理程序。你的执行环境可奇怪的或损坏的,当你进入这些职能,当然,所以要小心你有多想一个健全的环境。

最后,当使用常规的尝试抓住对你可以考虑使用功能试试块而不是打开一个尝试框在体的功能:

int foo(int x) try {
  // body of foo
} catch (...) {
   // be careful what's done here!
}

他们是一个相对不为人知的一块C++和在某些情况下可能提供恢复即使在发生部分(小规模)堆腐败。

最后,是的,你可能会想要调查哪些信号你可以continuably处理自己的或者在其上你可能中止,如果你想要较少的处理机制的地方,则可以考虑呼吁没有扔版本的新的运营商和汇编不产生浮点的例外情况,如果需要的(可以随时查询isnan(.), isfinite(.), 在FP结果,以保护你自己)。

在这最后注意到,应小心:我注意点浮动结果的分类功能,可以在不同标题下linux和windows...所以你可能要conditionalize这些包括。

如果你感觉puckish,它写所有采用setjmp和值指出控制(这是一个笑话...).

抓捕C++的例外 catch(...) 已经把你放到一个黄昏区。

试图赶上的错误没有抓到过 catch(...) 把你正视内未定义的行为。没有C++代码是保证工作。你最小的代码记录可能会导致导弹发动代替。

我的建议是不要去尝试 catch(...).只有赶上的例外情况,你可以有意义和安全记录,并让OS处理其余部分,如果有的话。

事后调试变得丑陋如果你有错误的处理码的失败上的根本原因。

的一种方式是易于使用、便携式,并且几乎没有使用任何资源将赶上空的课程。我知道这可能听起来奇怪,但它可以是非常有用的。

这里是一个例子,我作为另外一个问题,也适用于你的问题了: 链接

还有,你可以有超过1:

try
{
   /* code that may throw exceptions */
}
catch (Error1 e1)
{
   /* code if Error1 is thrown */
}
catch (Error2 e2)
{
   /* code if Error2 is thrown */
}
catch (...)
{
   /* any exception that was not expected will be caught here */
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top