C++ 程序不';t输入u_,除块外

C++ 程序不';t输入u_,除块外,c++,exception-handling,C++,Exception Handling,我正试图通过帮助实现处理Windows异常 除块外的\uuuuuuuu尝试/\uuuu 问题是,除了块之外,程序从未进入\uu,只会错误地退出 工作空间: 操作系统:Windows7x64;框架:AccabDeCo XE5 C++ + Builder; 应用程序模板类型:控制台64位应用程序(适用于32位正常工作!) 代码: 输出: before action before action in excepiton filter 然后错误退出 在第二个变体中,我以这种方式添加了异常处理程序:

我正试图通过帮助实现处理Windows异常 除块外的
\uuuuuuuu尝试/\uuuu

问题是,除了
块之外,程序从未进入\uu,只会错误地退出

工作空间: 操作系统:Windows7x64;框架:AccabDeCo XE5 C++ + Builder; 应用程序模板类型:控制台64位应用程序(适用于32位正常工作!)

代码:

输出:

before action
before action
in excepiton filter
然后错误退出

在第二个变体中,我以这种方式添加了异常处理程序:

LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS p)
{
  printf("in excepiton filter\n");
  return EXCEPTION_EXECUTE_HANDLER;
}

int _tmain(int argc, _TCHAR* argv[])
{
  AddVectoredExceptionHandler(1, MyVectorExceptionFilter);
  // the same text
  // ...
}
在此之后,我得到了以下输出:

输出:

before action
before action
in excepiton filter
然后错误退出

为什么程序不进入除块之外的_u
?
在进入异常处理程序后,是否有方法继续正常工作

  • *p=1;不会扔。。。您想要的是“抛出std::Exception()
  • 投掷是相对昂贵的,所以try{{}catch{throw}}catch{}是不好的。只需要一次试一试
  • (观点)坚持随身携带的东西——试着抓住。MS通过外观添加了这一点,这样他们最终可以像java一样。如果您使用uuuu try uuuu catch,您将开始使用这些工具,当您必须在Linux上编写一些东西时,您将想知道为什么它没有编译
  • 在进入异常处理程序后,是否有方法继续正常工作


    取决于异常及其对程序的意义。唯一的建议是遵循命名规则-例外情况除外。这可能是因为读取会被阻塞,在这种情况下,您可以坐在那里等待更多—或者可能是因为无法加载dll,而应用程序需要它—在这种情况下,不,您无法恢复。

    您必须保持一致。你可以使用C++ <代码>尝试<代码> >代码> catch <代码>来捕获C++异常,或者你可以使用微软结构化异常处理来捕捉低级别错误,使用<强> >代码> <代码> <强> > <代码> >除< /代码>,最后<代码>最后>

    在您的示例中,由于没有用C++关键字<代码>错误地引入保护块,请尝试进入异常处理程序。


    只需将有问题的
    try
    替换为
    \uu-try
    就可以正确调用异常处理程序。

    如果你想使用
    \uu-try
    ,除了
    ,你不应该使用
    \uu-try
    吗?有趣的是,它甚至可以编译-如果你可以在没有编译器barfing的情况下进行混合和匹配,这不是一个很好的MS扩展。@Singerofall尝试-无效:)@UKMonkey你能分享一些更好的解决方案/实践吗?谢谢你的回答!由像我这样的代码引起的异常不能被标准的try/catch块捕获(请纠正我,但我通过实验证明了这一点)。关于捕获的目的:在发生严重错误的情况下,我只想将我的消息发布给用户并正确关闭应用程序。但在printf之后的异常处理程序中,它错误地退出。“由像我这样的代码引起的异常不能被标准的try/catch块捕获”-参见我的观点(1)。关于你的另一部分,我们不知道MyVectoreExceptionFilter是什么;这个问题有错吗?我建议你仔细检查一下谢谢你的回答!我已经尝试用
    \u try
    替换
    try
    ——功能仍然保留。问题已更正。@Sas:我不能再复制了。在UNICODE和MBCS模式下,问题中当前的代码在操作前正确地给出了
    ,除了main
    的catch block end中的block(在旧的VS2008 32位中)(我使用
    #include#include#include#include
    作为头)。唯一奇怪的是,你抛出一个C字符串,这可能会导致问题。如果抛出int或C++字符串会发生什么?