Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++__努力尝试/抓住/最后 我想知道C++的尝试/捕获/最后的块。我见过这些带有两个下划线的命令,如uuu try。但MVSC2010项目也没有下划线。那么您什么时候需要这些下划线呢?_C++_Exception Handling_Try Catch_Finally - Fatal编程技术网

C++__努力尝试/抓住/最后 我想知道C++的尝试/捕获/最后的块。我见过这些带有两个下划线的命令,如uuu try。但MVSC2010项目也没有下划线。那么您什么时候需要这些下划线呢?

C++__努力尝试/抓住/最后 我想知道C++的尝试/捕获/最后的块。我见过这些带有两个下划线的命令,如uuu try。但MVSC2010项目也没有下划线。那么您什么时候需要这些下划线呢?,c++,exception-handling,try-catch,finally,C++,Exception Handling,Try Catch,Finally,\uuu try/\uu除了如果您希望您的代码可以使用其他编译器(例如C g++)(或)在另一个操作系统中进行编译,请避免使用它们,并坚持使用语句\uu try\uu,除非用于捕获而不是捕获一般异常 代码>尝试 >代码> catch ,这是C++标准处理一般C++异常所指定的内容。 对于你编写的标准C++代码,你应该总是使用尝试 >代码> catch ,而不是尝试< >代码> > < > /p> 也,最后< /COD>不是C++标准指定的构造,它对您有效,因为它是Windows上的 ./p

\uuu try/\uu除了
如果您希望您的代码可以使用其他编译器(例如C g++)(或)在另一个操作系统中进行编译,请避免使用它们,并坚持使用语句

\uu try
\uu,除非
用于捕获而不是捕获一般异常

<>代码>尝试<代码> >代码> catch <代码>,这是C++标准处理一般C++异常所指定的内容。

对于你编写的标准C++代码,你应该总是使用<代码>尝试<代码> >代码> catch <代码>,而不是<代码>尝试< <代码> >代码> > < <代码> > /p>


也,<代码>最后< /COD>不是C++标准指定的构造,它对您有效,因为它是Windows上的<强> <强> ./p>< p>,操作系统级别支持异常。它们被称为结构化异常处理(SEH),大致相当于Unix信号。为Windows生成代码的编译器通常利用这一点,他们使用SEH基础结构来实现C++异常。

与C++标准一致,抛出和捕获关键字只会抛出并捕获C++异常。MSVC编译器对应的SEH异常代码为0xe06d7363。最后3个字节是“msc”的ASCII码

与操作系统支持一起统一,也意味着在Seh异常的堆栈展开过程中会调用C++析构函数。执行展开的代码位于Windows内部,并以与任何SEH完全相同的方式处理抛出引发的SEH。但是,Microsoft编译器有一个优化,它试图避免生成确保在所有情况下都调用析构函数所需的代码。如果它可以证明作用域块中没有控制对象生命周期的throw语句,那么它将跳过注册码。这与异步SEH异常不兼容,如果要捕获SEH异常,应使用/EHa compile选项抑制此优化

有很多SEH异常类型。可以由操作系统生成的文件列在ntstatus.h SDK头文件中。此外,您可以与使用SEH实现自己的异常处理的代码进行互操作,他们将使用自己的异常代码。与.NET一样,托管异常使用0xe0434f4d(“com”)异常代码

<>在C++程序中捕捉SEH异常时,必须使用非标准的“YTHESTTER”关键字。除关键字之外,类似于C++ catch关键字。它有更多的功能,您可以指定一个异常过滤器表达式来确定是否应该捕获活动异常。任何事情都是可能的,但您通常只查看传递的异常信息,看看是否有兴趣处理它。_u_finally关键字允许您编写在异常处理后运行的代码。在C++中没有等价的,但在其他语言中并不少见。< /P> 正如评论中所指出的,所有这些都是相当糟糕的记录。证据就在布丁里。下面是一个可以使用的示例程序。它演示了SEH异常如何仍然允许调用C++析构函数,只要您编译/EHA以及如何在SEH之上实现C++异常。需要MSVC编译器,请使用Ctrl+F5运行以避免调试器的帮助:

#include "stdafx.h"
#include <windows.h>
#include <iostream>

// NOTE: the value of the C/C++, Code Generation, Enable C++ Exceptions setting in important
// Try it both with /EHsc (the default) and /EHa to see the difference

class Example {  
public:
    ~Example() { std::cout << "destructed" << std::endl; }
};

int filterException(int code, PEXCEPTION_POINTERS ex) {
    std::cout << "Filtering " << std::hex << code << std::endl;
    return EXCEPTION_EXECUTE_HANDLER;
}

void testProcessorFault() {
    Example e;
    int* p = 0;
    *p = 42;
}

void testCppException() {
    Example e;
    throw 42;
}

int main()
{
    __try {
        testProcessorFault();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    __try {
        testCppException();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    return 0;
}

一个指向文档的链接,其中明确说明了答案第3段中的推理?据我所知,没有一个链接,只为C编译器记录了#try的行为。文件中有一点关于/EHa的内容,但这是不够的。如果文档始终是一流的,那就不会有任何问题:)嗯,非常玄学,我们不是都只是蝴蝶在感知人类吗?这个蝴蝶认为他在Windows上已经在C++上写了15年的机器控制软件。让SEH撞坏机器在我们的客户中不太受欢迎。不要太担心落选,你的答案很受欢迎,你可能会因此得到一枚徽章。另一种看法。请不要误解我的评论,我对你有很高的敬意&自从我开始参加这里的活动以来,你就已经给出了很好的答案。至于否决票,我并不担心,但如果我或其他任何人没有从否决票中学到任何东西,那么这对任何人都没有好处。我只是想为你提供的一个相互矛盾的观点寻找一个文件证据或逻辑解释,因为我必须相信这一点,以纠正我可能有的错误理解。在任何情况下/条件下,我都不是有意冒犯,所以请不要采取任何行动。我来晚了,但这篇文章是最后一次推动,它使我们开始了解如何处理SEH异常,这样我们既可以保护我们的客户不受崩溃的影响,又可以获得一些关于故障发生地点的有用信息。谢谢你,汉斯,你穿越了丛林,让光线照进来。try/catch不适合SEH。当<>代码> EHA < /C> >(是的,使用SEH异常)时,使用Test/catch将处理C++和SEH异常。缺点是,
catch(…)
将处理SEH,但您无法知道异常代码。当使用
EHa
时,将调用析构函数。
try
\u-try
不能在同一个函数中混合使用。因此,最好有两个函数(一个调用另一个):一个处理
try
,另一个处理
\uu-try
(无
/EHa
)<代码>最后< /COD>不是C++,对于正确编写的C++代码来说,它确实没有意义。@ BAMES53说一些毫无意义的话,如果你不支持你的陈述,就没有多大帮助。
Filtering c0000005
destructed
caught
Filtering e06d7363
destructed
caught