草庐IT

Try-catch

全部标签

c++ - ex.what() 嵌套 try-catch 的变化

我有一个嵌套的try-catch代码,如下所示:voidA(){try{//CodelikeA=string(NULL)thatthrowsanexception}catch(std::exception&ex){cout运行后我得到了这个结果:inA:basic_string::_M_constructnullnotvalidinB:std::exception如您所见,ex.what()在函数A中工作正常并告诉我正确的描述,但在B中ex.what()告诉我只是std::exception。为什么会这样?我是否在函数A的catch子句中抛出了一些不同或错误的东西?如何抛出嵌套异常,以

c++ - 如何捕捉空指针异常?

这个问题在这里已经有了答案:Catchingaccessviolationexceptions?(8个回答)关闭5年前。try{int*p=0;*p=1;}catch(...){cout我试图捕捉这样的异常,但它不起作用,有什么帮助吗? 最佳答案 C++中不存在“空指针异常”之类的东西。您可以捕获的唯一异常是throw表达式显式抛出的异常(另外,正如Pavel所指出的,标准operatornew、dynamic_cast等)。C++中没有其他异常(exception)。取消引用空指针、除以零等在C++中不会产生异常,它会产生未定义的

c++ - 如何捕捉空指针异常?

这个问题在这里已经有了答案:Catchingaccessviolationexceptions?(8个回答)关闭5年前。try{int*p=0;*p=1;}catch(...){cout我试图捕捉这样的异常,但它不起作用,有什么帮助吗? 最佳答案 C++中不存在“空指针异常”之类的东西。您可以捕获的唯一异常是throw表达式显式抛出的异常(另外,正如Pavel所指出的,标准operatornew、dynamic_cast等)。C++中没有其他异常(exception)。取消引用空指针、除以零等在C++中不会产生异常,它会产生未定义的

c++ - C++ 异常处理如何转化为机器码

在心理上,我一直想知道当C++编译将其转换为汇编程序时,try/throw/catch在幕后看起来如何。但由于我从不使用它,所以我从来没有时间检查它(有些人会说懒惰)。是用于跟踪try的普通堆栈,还是单独为此目的而保留的每个线程堆栈?MSVC和g++之间的实现是大还是小?请给我看一些伪asm(IA-32也可以),这样我就不必自己检查了!:)编辑:现在我了解了MSVC在IA-32处理方面的实现基础。有人知道IA-32上的g++或任何其他CPU吗?编辑2(11年后):Here是一些关于性能的数据。他们还制作了sourcecode免费提供。 最佳答案

c++ - C++ 异常处理如何转化为机器码

在心理上,我一直想知道当C++编译将其转换为汇编程序时,try/throw/catch在幕后看起来如何。但由于我从不使用它,所以我从来没有时间检查它(有些人会说懒惰)。是用于跟踪try的普通堆栈,还是单独为此目的而保留的每个线程堆栈?MSVC和g++之间的实现是大还是小?请给我看一些伪asm(IA-32也可以),这样我就不必自己检查了!:)编辑:现在我了解了MSVC在IA-32处理方面的实现基础。有人知道IA-32上的g++或任何其他CPU吗?编辑2(11年后):Here是一些关于性能的数据。他们还制作了sourcecode免费提供。 最佳答案

c++ - 为什么 try..catch block 需要大括号?

虽然在if...else等其他语句中,如果block中只有一条指令,您可以避免使用大括号,但您不能使用try...catchblock来做到这一点:编译器不会购买它。例如:trydo_something_risky();catch(...)std::cerr使用上面的代码,g++只是说它在do_something_risky()之前需要一个“{”。为什么try...catch和if...else之间的这种行为差异?谢谢! 最佳答案 直接来自C++规范:try-block:trycompound-statementhandler-se

c++ - 为什么 try..catch block 需要大括号?

虽然在if...else等其他语句中,如果block中只有一条指令,您可以避免使用大括号,但您不能使用try...catchblock来做到这一点:编译器不会购买它。例如:trydo_something_risky();catch(...)std::cerr使用上面的代码,g++只是说它在do_something_risky()之前需要一个“{”。为什么try...catch和if...else之间的这种行为差异?谢谢! 最佳答案 直接来自C++规范:try-block:trycompound-statementhandler-se

c++ - 函数的 try-catch 语法之间的区别

我最近在try-catchforfunction中遇到了这种语法。structA{inta;A(inti):a(i)//normalsyntax{try{}catch(...){}}A()//somethingdifferenttry:a(0){}catch(...){}voidfoo()//normalfunctiontry{}catch(...){}};两者syntaxarevalid.除了编码风格之外,这些语法之间是否有任何技术差异?其中一种语法在任何方面都优于其他语法吗? 最佳答案 第一个语法:tryblock的范围在成员初

c++ - 函数的 try-catch 语法之间的区别

我最近在try-catchforfunction中遇到了这种语法。structA{inta;A(inti):a(i)//normalsyntax{try{}catch(...){}}A()//somethingdifferenttry:a(0){}catch(...){}voidfoo()//normalfunctiontry{}catch(...){}};两者syntaxarevalid.除了编码风格之外,这些语法之间是否有任何技术差异?其中一种语法在任何方面都优于其他语法吗? 最佳答案 第一个语法:tryblock的范围在成员初

c++ - 在 C++ 中通过指针捕获异常

我发现捕获异常有三种方式,有什么区别?1)按值(value)捕获;2)通过引用捕获;3)指针捕获;我只知道按值捕获会调用对象的两个拷贝,按引用捕获会调用一个。那么如何通过指针捕获呢?何时使用指针捕获?除了抛出一个对象,我可以像这样抛出一个指向对象的指针吗?classA{}voidf(){A*p=newA();throwp;} 最佳答案 推荐的方式是按值抛出,按引用捕获。您的示例代码抛出了一个指针,这是一个坏主意,因为您必须在catch站点管理内存。如果您真的觉得应该抛出一个指针,请使用智能指针,例如shared_ptr。无论如何,H