代码之家  ›  专栏  ›  技术社区  ›  Feyyaz Phill Pafford

win32线程意外退出

  •  0
  • Feyyaz Phill Pafford  · 技术社区  · 14 年前

    我正在编写一个C++应用程序。我意识到我的一个工作线程可能会意外终止。(vs 2005)调试日志显示:

    线程“win32 thread”(0x5d98)具有 退出代码-858993460 (0xCCCCCC)。

    我用try/catch块包围了所有工作线程代码。所以,如果原因是一个例外,我会抓住它。但我不能:

    try{
       ...
       Connection* conn = connectionPool->getConnection(); // unexpected exit occurs here
       ...
    } catch(exception& e) {
       ...
    }
    

    我有10个线程同时运行,其中只有一个线程在一段时间后崩溃,而其他线程继续运行(并获得新的[occi]连接)。

    是否有一个异常类型未被“异常”捕获?或者我对线程/异常不了解什么?

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  2
  •   anon    14 年前

    并不是所有的错误都会引发C++异常,这些异常会被C++尝试捕获机制捕获。例如,除以零不会引发C++异常,但会导致未定义的行为,这可能会使您的应用程序退出。

    但是,您的代码可能是抛出不是STD::异常的东西,所以您可能想重写:

    try{
       Connection* conn = connectionPool->getConnection(); // unexpected exit occurs here
    } 
    catch(exception& e) {
        // handle things derived from std::exception
    }
    catch ( ... ) {
       // handle things that are not so derived
    }
    

    它会处理像 throw "eeek!";

    而且,与问题无关,通常应该通过const引用捕获异常。

        2
  •  1
  •   Cat Plus Plus    14 年前

    是否有一个异常类型未被“异常”捕获?

    是的,SEH例外。要抓住他们你要么用 __try / __except MSVC扩展(请参阅 Structured Exception Handling ,或编写全局seh/veh处理程序(请参见 SetUnhandledExceptionFilter AddVectoredExceptionHandler )

        3
  •  1
  •   Canopus    14 年前

    找到问题的最简单方法是在调试器下运行应用程序,并在win32异常上启用中断。每当遇到win32异常时,应用程序都会闯入调试器,您可以找出哪里出错了。

    如果不进行调试并要捕获win32结构化异常,则必须使用 _set_se_translator 用于设置转换函数的API。每当有Win32异常时,就会调用注册函数,并有机会将其转换为您选择的C++异常。

        4
  •  1
  •   Stack Overflow is garbage    14 年前

    catch(exception& e) 捕获来自C++的异常 std::exception ,其他都没有。

    它不捕获C++异常。 从那个类派生(如果我是 throw 42 ,例如,它不会被捕获),也不会在系统级别捕获异常或错误。

    Windows使用结构化异常处理(SEH)来发出错误,而这些错误并不是用普通C++来捕获的。 catch 陈述。这可能包括诸如被零除之类的错误,以及访问冲突或在操作系统或硬件级别可能出错的几乎任何其他情况。

    The docs 对如何捕获seh异常有一个很好的解释。

        5
  •  0
  •   Feyyaz Phill Pafford    14 年前

    我发现了一条重要线索。使用close handle函数关闭句柄时,线程将以代码0xcccccccc退出。在这条线索的帮助下,我意识到在非常罕见的情况下,即使线程在工作,我也会关闭线程的句柄。为什么它会在连接时退出?这也有一个解释,但它与代码的结构有关,这里可能很难解释。

    谢谢大家,在例外问题上和我一起集思广益:$。