使main()"不可见"

Dav*_*ler 4 c++ exception-handling

我想编写一个守护程序管理器来管理所有守护程序正在运行,就像这样(简化的伪代码):

void watchMe(filename)
{
    while (true)
    {
        system(filename); //freezes as long as filename runs
        //oh, filename must be crashed. Nevermind, will be restarted            
    }
}       

int main()
{
    _beginThread(watchMe, "foo.exe");
    _beginThread(watchMe, "bar.exe");
}
Run Code Online (Sandbox Code Playgroud)

这部分已经工作 - 但是现在我面临的问题是,当观察到的应用程序 - 比如说foo.exe - 崩溃时,相应的系统调用会冻结,直到我确认这个漂亮的消息框:

错误消息

这使守护进程无用.

我认为可能是一个解决方案是使观察到的程序(我控制)的main()"不可擦除",这样他们就可以优雅地关闭而不显示这个丑陋的消息框.

像这样:

try
{
    char *p = NULL;
    *p = 123; //nice null pointer exception
}
catch (...)
{
    cout << "Caught Exception. Terminating gracefully" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它仍然会产生此错误消息:

错误消息

("未经处理的异常...写入访问冲突......")

我已经尝试了SetUnhandledExceptionFilter和所有其他东西,但没有效果.

任何帮助将受到高度赞赏.

电贺

aru*_*rul 5

这似乎更像是SEH异常而不是C++异常,需要以不同方式处理,请尝试以下代码:

__try
{
    char *p = NULL;
    *p = 123; //nice null pointer exception
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? 
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
    cout << "Caught Exception. Terminating gracefully" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这是一种补救措施,而不是治愈方法,您可能会更好地运行沙箱中的流程.