我创建了以下C#程序:
namespace dispose_test
{
class Program
{
static void Main(string[] args)
{
using (var disp = new MyDisposable())
{
throw new Exception("Boom");
}
}
}
public class MyDisposable : IDisposab
我用C++写了一个Linux守护进程。代码如下所示:
int main(int argc, char** argv)
{
daemon(1, 0); // Daemonize itself, retaining the current working directory and redirecting stdin, stdout and stderr to /dev/null.
// My program logic goes here
}
问题是,我的程序逻辑偶尔会抛出异常。如何捕获异常,以便知道哪里出了问题?
我知道对于普通的控制台应用程序,未捕获的异常将被转储到控制台。在
我有一个在MS Visual Studio2005中构建的C++应用程序,它链接到第三方库。对于特定的输入,应用程序在第三方库中崩溃(显然是在realloc.c中的某个地方;所以一定是某种内存问题)。我在release中运行,因为输入很大。所以我一直运行到崩溃,然后选择调试。当我单独调试有罪函数时,我希望使用一些异常处理来防止应用程序崩溃,而不是干净利落地退出。所以我使用了类似这样的东西:
try {
//- call 3rd party application function that fails
}
catch(...) {
//- handle exception or w
下面有密码。当我运行它时,会得到一个错误:
*
STDOUT:
[librpc/rpc/dcerpc_connect.c:337:dcerpc_pipe_connect_ncacn_ip_tcp_recv()] failed NT status (c00000b5) in dcerpc_pipe_connect_ncacn_ip_tcp_recv
[librpc/rpc/dcerpc_connect.c:828:dcerpc_pipe_connect_b_recv()] failed NT status (c00000b5) in dcerpc_pipe_connect_b_recv
[wmi
有时(大约100次运行中有1次),我的程序会终止,并显示以下消息:
terminate called after throwing an instance of 'Poco::SystemException'
what(): System exception
我的代码不是捕获异常的代码(我捕获的所有代码都比较冗长),并且我不确定它是在哪里捕获的。异常很可能包含有用的消息,但它不是通过what()方法返回的,而是由displayText()方法返回的。
字符串“在抛出实例后调用”在Google中有大约600k,所以它可能是由编译器插入的代码或由某个公共库(pthread?)
在更有效的c++第13项中,第13项:通过引用捕获异常。
也就是说-为了通过指针捕获异常来工作,程序员必须以一种方式定义异常对象,以确保对象在控制离开函数后仍然存在。全局和静态对象都可以很好地工作。
//使用指针捕获异常的示例
class exception { ... }; // from the standard C++
void someFunction()
{
static exception ex; // exception object
...
throw &ex;