C++ 程序不';t输入u_,除块外
我正试图通过帮助实现处理Windows异常 除块外的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 然后错误退出 在第二个变体中,我以这种方式添加了异常处理程序:
\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++字符串会发生什么?