C++异常注意事项

C++里面catch对于类型转换,限制比参数传递时候要多:

不可以进行标准算术转换类的自定义转换:在函数参数匹配的过程中,可以进行很多的类型转换。但是在异常匹配的过程中,转换的规则要严厉。

标准算术转换,指的是 short转成int 等等。异常catch的时候,不允许转换,指的是匹配的时候,就不会匹配上。比如下面:

#include <iostream>
#include <exception>
#include <stack>

using namespace std;

int main() {
    std::cout << "Hello, World!" << std::endl;

    stack<int> stk;
    //stk.push(5);
    try {
        //stk.pop();
        short s = 5;
        throw s;
    }
    /*catch(runtime_error exception1) {
        std::cout << exception1.what() << endl;
    }*/
    catch(int &x) {
        std::cout << x << endl;
    }
    catch (...) {
        cout << "here catch" << endl;
    }

    return 0;
}

输出:

here catch

意味着,int对于short的catch没有接住。

另外,异常处理机制的匹配过程是寻找最先匹配(first fit),函数调用的过程是寻找最佳匹配(best fit)。

拷贝代价

如果throw中抛出一个对象,那么无论是catch中使用什么接收(基类对象、引用、指针或者子类对象、引用、指针),在传递到catch之前,编译器都会另外构造一个对象的副本。也就是说,如果你以一个throw语句中抛出一个对象类型,在catch处通过也是通过一个对象接收,那么该对象经历了两次复制,即调用了两次复制构造函数。

一次是在throw时,将“抛出到对象”复制到一个“临时对象”(这一步是必须的),然后是因为catch处使用对象接收,那么需要再从“临时对象”复制到“catch的形参变量”中; 如果你在catch中使用“引用”来接收参数,那么不需要第二次复制,即形参的引用指向临时变量。

析构、构造函数

2. 析构函数应该从不抛出异常。如果析构函数中需要执行可能会抛出异常的代码,那么就应该在析构函数内部将这个异常进行处理,而不是将异常抛出去。

原因:在为某个异常进行栈展开时,析构函数如果又抛出自己的未经处理另一个异常,将会导致调用标准库 terminate 函数。而默认的terminate 函数将调用 abort 函数,强制从整个程序非正常退出。

3. 构造函数中可以抛出异常。但是要注意到:如果构造函数因为异常而退出,那么该类的析构函数就得不到执行。所以要手动销毁在异常抛出前已经构造的部分。

时间: 2024-10-05 23:13:45

C++异常注意事项的相关文章

Java异常实践事项

在大学项目开发中, 你有没发现自己做的项目总是出现bug,不仅仅出现bug,而且很难根据异常信息找到异常源.我当时也是非常懊恼, 可怕的是不知道怎么维护... 软件Java异常需要理解基础的知识, 在实战中较好的处理异常.Java异常基础知识 .tryCatchFinally语句块  本节总结Java异常在实践中的相关事项 1. 在Finally中清理资源或者使用Try-With-Resource语句       不要在try中关闭资源.因为一旦发生异常, 将无法正常关闭资源.以下代码给出二种处

事务异常注意事项

主要点: TRY...CATCH不会返回对象错误或者字段错误等类型的错误 当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚. 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理.如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务.OFF 是默认设置. 编译错误(如语法错误)不受 SET XACT_ABORT 的

异常注意事项

try   catch  finally return public int f(){ try{ String demo=null; demo.split("a"); System.out.println("try"); }catch(Exception e){ System.out.println("catch"); }finally{ System.out.println("finally"); } } public st

java 19 - 11 异常的注意事项

1 /* 2 * 异常注意事项: 3 * A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类.(父亲坏了,儿子不能比父亲更坏) 4 * B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常 5 * C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws 6 */ 7 import java.text.ParseException; 8 import j

Java基础知识强化之IO流笔记08:异常的注意事项

1. 异常注意事项: (1)子类重写父类方法时候,子类的方法必须抛出相同的异常或者父类异常的子类.(父亲坏了,儿子不能比父亲更坏) (2)如果父类抛出多个异常,子类重写父类时候,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常.(父亲坏了,儿子不能比父亲更坏) (3)如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws(父亲坏了,儿子不能比父亲更坏) 2.代码示例: 1 package com.himi.mye

异常-异常的注意事项

1 package cn.itcast_09; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 /* 8 * 异常注意事项: 9 * A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类.(父亲坏了,儿子不能比父亲更坏) 10 * B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类

java019异常、File类

异常的分类: * Error:称为错误类.表示java运行时系统内部错误或者资源耗尽的错误,仅靠修改程序本身不能恢复执行的.比如:服务器宕机,数据库崩溃等 * Exception:称为异常类,表示程序本身可以处理的错误. 继承体系 * Throwable  * Error   * Exception   * RuntimeException //除了运行时异常都是编译时异常,一般都是程序员本身的错误 JVM默认处理异常的方式: * a:自己将该问题处理,然后继续运行,对应下方的 a 代码 * b

异常总结,配套day19

我们自己如何处理异常呢?    A:try...catch...finally 捕获异常,处理异常,在try语句块中捕获异常,在catch块中进行匹配异常与异常处理,在finally块中进行资源释放.    B:throws 抛出异常 try...catch...finally的处理格式:          try {              可能出现问题的代码;          }catch(异常名 变量) {              针对问题的处理;          }finally

Object类-try-catch-finally-throw-throws-自定义异常

一.Object类     Object类是最顶端的类,其它类都是它的子类,它的方法可以被继承.如果定义的类没有继承别的类,那它的直接父类就是Object.如果方法参数类型为object类型, 则调用方法可以传递任意类型的值(相当于多态);同理,如果方法返回值为Object类型,那么给方法的返回数据值为任意类型.     两种常用方法:toString()/equals() (1)toString方法 源码: public String toString(){         return ge