在线程主函数内使用了 throw 语句,考虑到执行效率没有在线程内使用 try{}和catch,这个throw在那里能够catch到呢?进程内所有的throw都应该有一个默认的最终的处理地方吧。

解决方案 »

  1.   

    线程内throw?可能会造成内存泄露哦
      

  2.   

    最好不要这么做吧,在线程里面catch比较好
      

  3.   

    一个try有这么浪费效率吗.
      

  4.   

    那关于异常的错误信息是记录在那里的呢?
    我在<Windows核心编程>中看到的例子提到异常信息好像是按线程管理的,
    所以对于别的线程来捕获本线程的异常表示怀疑,清代为解惑!
      

  5.   

    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)UnknowExceptionHandler);
    set_unexpected(Unexpected);对于未处理的结构异常和未处理的C++异常,可以自己写两个函数进行捕获。
    SetUnhandledExceptionFilter处理没处理的结构化异常;
    set_unexpected处理没处理的C++异常。
      

  6.   

    异常回在最近的一个catch的地方被捕捉到
      

  7.   

    Windows结构异常作为硬件异常(如访问非法或被零除)或操作系统异常的结果被抛出,C++异常只能由throw语句抛出。Windows结构异常处理不能处理对象的解析,因此你应该在C++程序中一直使用C++异常。然而,C++异常不能处理硬件和操作系统异常,你的程序需要将结构异常转化为C++异常。C++异常并不直接从你的程序代码中抛出而是从C++运行库中抛出,因此你需要调用栈窗口来返回你的代码。为了正确处理硬件和操作系统异常,你可以创建自己的异常类并使用_set_se_translator函数安装一个结构异常向C++异常的转化器,但不要捕获那些不能恢复所产生问题的转化后的结构异常。3、MFC中的异常  在MFC中,所有的异常对象都是从CException基类(它有使用起来非常方便的GetErrorMessage和ReportError成员函数)中派生来的。大多数的MFC异常对象都是动态分配的,而且当它们被捕获时,必须被删除,而没有被捕获的MFC异常由MFC本身在AfxCallWndProc函数中捕获并删除。4、异常的开销  当抛出C++异常时,函数调用链将从此回溯搜索,寻找可以处理抛出这类异常的处理器。若没找到,进程结束。如果找到,调用栈将被释放,所有的自动(局部)变量也将释放,然后栈将被整理为异常处理器的上下文相关设备。因此异常开销由一个异常处理器目录和一个活动的自动变量表(它需要额外的代码、内存,而且不论异常是否抛出,都会运行),还得加上函数调用链的搜索、自动变量的解析和栈的调整(它只在抛出异常的时候需要执行)组成。5、异常策略(1)抛出时机  抛出异常的时机应该是一个函数发现一个错误,如果没有一些特殊的操作,该错误能阻止程序正常的运行,而这种操作它自己不能完成,或是在函数不可能有返回值的时候。  使用异常处理更简单,更可靠,更有效,可以创建更健壮的代码。然而,应该只在意外的情况下使用异常处理。如果你认为一个指针应该是空值,这种条件下就直接在代码中检查这个值,而不要使用异常。(2)何时捕获对于这个问题,有一些可能的标准:.当函数知道如何处理这个异常时。.当这个函数可以合理地处理这个异常而高级的函数不知道如何处理时。.当抛出异常可能使进程崩溃时。.当函数可以继续执行它的任务时。.当需要整理分配好的资源时。  异常处理的一个缺点是它可能导致资源的泄露。因此,防止资源泄露更应该是保持程序异常安全的一部分。栈释放时会自动整理局部变量,但不包括动态分配的变量。可以使用智能(smart)指针来保护你的代码在存在异常的情况下不会产生资源泄漏。(3)怎样捕获.非MFC的C++异常应该通过引用来捕获。使用引用捕获异常不需要删除异常对象(因为使用引用捕获的异常会在栈中传送),而且它保留了多态性(因此你捕获的异常对象正是你抛出的异常对象)。.MFC异常应该通过指针来捕获。使用指针捕获异常需要你删除对象。因为它们通常从堆中分配,当你处理完异常之后,需要调用Delete成员函数来删除。你不可以使用省略捕获处理器捕获MFC异常,这会导致一个内存泄露。必须使用Delete成员函数删除MFC异常,而不用delete,因为一些MFC异常为静态对象创建。在释放栈的过程中抛出异常会导致进程的终止。释放栈涉及到调用析构函数,异常可以阻止调用delete操作符,这样会有资源泄漏,因此异常最好不要从析构函数中抛出。如果非要在析构函数里抛出异常,必须妥善处理,避免资源泄漏。
      

  8.   

    不可以的,只能在线程内catch,如果想有一个统一的跨线程的处理地点,可以在线程内catch后统一向一个窗体发消息。