- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在学习 C++ 中的 try-catch
block ,但我不了解 catch
函数的语法。在 cppreference 上,它表示如下:
1) 在catch子句中声明形参:
catch (const std::exception& e) { /* */ }
2) 声明一个未命名的参数:
catch (const std::exception&) { /* */ }
3) 编写一个“包罗万象的处理程序”(不确定这是什么意思),任何异常都会激活它:
catch (...) { /* */ }
问题:
1) 这些 catch
block 之间有什么区别?我不确定形式参数、未命名参数和“包罗万象的处理程序”有何不同。
2) catch
子句的参数e
是什么类型?它是 exception
类型吗?除了在如何编写 try-catch
block 的示例中,我从未见过这种类型。如果是这样,我如何在 catch
子句中使用它来输出错误消息?当我抛出错误时,e
可以接受我发送的字符串吗?
3) 我已经试验并编写了一个 try-catch
block ,如下所示:
#include <iostream>
#include <string>
#include <stdexcept>
try
{
throw invalid_argument("Error, program stopped.");
}
catch(const string& e)
{
cout << e;
}
此代码成功调用了 catch
block 并打印了我的消息:“错误,程序已停止。”
。但是,.exe 突然停止工作并崩溃。不知道这是抛出异常时的正常情况,还是我的代码有问题。
最佳答案
catch (const std::exception& e) { /* */ }
如果您希望能够访问 catch block 中的异常对象,则需要使用命名异常。例如,如果你想打印 e.what()
.
catch (const std::exception&) { /* */ }
如果您不需要访问异常对象,您可以使用未命名的异常。也许您并不关心异常的内容,而只想以相同的方式处理所有(此类)异常。
catch (...) { /* */ }
C++ 允许您抛出任何类型的对象,无论它是否是从std::exception
派生的类型。 .这种类型的 catch block 将捕获任何抛出的东西。就像未命名的异常一样,您将无权访问抛出的对象。而且,您甚至无法知道它是什么类型。
对于您的最后一个示例,我认为不是您的 catch block 正在打印消息。毕竟,你抓错了类型。一些编译器会自动插入异常捕获代码,捕获任何从 main 转义的内容,如果它是从 std::exception
派生的类型。 , 它将打印 what()
的结果, 在终止程序之前。我相信 GCC 会这样做,但 Visual Studio 不会。不确定 Clang 或任何其他编译器。
关于C++ - 不理解 try-catch 中 catch 函数的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603687/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!