网站建设公司合肥,常见的一级域名com代表,免费logo设计官网,wordpress主机推荐 阿里云异常是程序在执行期间产生的问题。C 异常是指在程序运行时发生的特殊情况#xff0c;比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C 异常处理涉及到三个关键字#xff1a;try、catch、throw。throw: 当问题出现时#xff0c;程序会抛出一个异常。这是通过使…异常是程序在执行期间产生的问题。C 异常是指在程序运行时发生的特殊情况比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C 异常处理涉及到三个关键字try、catch、throw。throw: 当问题出现时程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在您想要处理问题的地方通过异常处理程序捕获异常。catch 关键字用于捕获异常。try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。const throw() 不是函数这个东西叫异常规格说明表示 what 函数可以抛出异常的类型类型说明放到 () 里这里面没有类型就是声明这个函数不抛出异常通常函数不写后面的 throw() 就表示函数可以抛出任何类型的异常。异常规格说明异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。 可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如void fun() throw(ABCD);2、若无异常接口声明则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下#include
#include
using namespace std;class MyException
{
public:MyException(const char *message): message_(message){cout MyException ... endl;}MyException(const MyException other) : message_(other.message_){cout Copy MyException ... endl;}virtual ~MyException(){cout ~MyException ... endl;}const char *what() const{return message_.c_str();}
private:string message_;
};class MyExceptionD : public MyException
{
public:MyExceptionD(const char *message): MyException(message){cout MyExceptionD ... endl;}MyExceptionD(const MyExceptionD other): MyException(other){cout Copy MyExceptionD ... endl;}~MyExceptionD(){cout ~MyExceptionD ... endl;}
};void fun(int n) throw (int, MyException, MyExceptionD)
{if (n 1){throw 1;}else if (n 2){throw MyException(test Exception);}else if (n 3){throw MyExceptionD(test ExceptionD);}}void fun2() throw()
{}int main(void)
{try{fun(2);}catch (int n){cout catch int ... endl;cout n n endl;}catch (MyExceptionD e){cout catch MyExceptionD ... endl;cout e.what() endl;}catch (MyException e){cout catch MyException ... endl;cout e.what() endl;}return 0;
}C Primer 中关于 what的解释在之前的例子里我们使用了一个 throw 表达式以避免把两个代表不同书籍的 Sales_item 相加。我们假设执行 Sales_item 对象加法的代码是与用户交互的代码分离开的。其中与用户交互的代码负责处理发生的异常它的形式可能如下所示while (cin item1 item2){try{//执行添加两个Sales_item对象的代码//如果添加失败代码抛出一个runtime_error异常} catch (runtime_error err){//提醒用户两个ISBN必须一致询问是否重新输入cout err.what() \nTry Again? Enter y or n endl;char c;cin c;İf (!cin || c n)break;//跳出while循环}
}程序本来要执行的任务出现在 try 语句块中是因为这段代码可能会抛出一个 runtime_error 类型的异常。try 语句块对应一个 catch 子句。该子句负责处理类行为 runtime_error 的异常。如果 try 语句块的代码抛出了runtime_error 异常接下来执行 catch 块内的语句。在我们书写的 catch 子句中数出一段提示信息要求用户指定程序是否继续。如果用户输入 n执行 break 语句并退出 while 循环否则直接执行 while 循环的右侧花括号意味着程序控制权条回到 while 条件部分准备下一次迭代。给用户的提示信息中输出了 err.what() 的返回值。我们知道 err 的类型是 runtime_error因此能推断 what 是 runtime_error 类的一个成员函数。每个标准库异常类都定义了名为 what 的成员函数。这些函数没有参数返回值是 C 风格字符串即 const char *其中runtime_error 的 what 成员函数返回的是初始化一个具体对象所用的 string 对象的副本。如果上一节编写的代码抛出异常则本节的 catch 子句输出:Data must refer to same ISBN
Try Again? Enter y or n在 C11 中声明一个函数不可以抛出任何异常使用关键字 noexcept。void mightThrow(); // could throw any exceptions.
void doesNotThrow() noexcept; // does not throw any exceptions.下面两个函数声明的异常规格在语义上是相同的都表示函数不抛出任何异常。void old_stytle() throw();
void new_style() noexcept;对于:const char * what () const throw ()
{
//函数体
}做几点说明从左到右看 1. const char * 表示返回值类型 2. what 是函数名称 3. () 是参数列表 4. const 表示该成员函数不能修改成员变量 5. throw() 是异常规格说明符。括号内写该函数可抛出的异常类型上述 5 点均为函数的声明部分。