zoukankan      html  css  js  c++  java
  • C++学习笔记--异常简介

    C++异常是对程序运行过程中发生的异常情况(如被0除)的一种响应。异常提供了将控制权从程序的一个部分传递到另一部分的途径。

    1、对异常的处理有3个部分组成:

    (1)引发异常

    (2)捕获有处理程序的异常

    (3)使用try块

    C++异常的简单例子:

    double hmean(double a,double b)
    {
    	if (a == -b)
    		throw "bad hmean() arguments: a = -b not allowed";//引发异常
    	return 2.0 * a * b / (a + b);
    }
    
    void test_exception()
    {
    	double x, y, z;
    	cout << "Enter two number:";
    	while (cin >> x >> y)
    	{
    		//使用try catch进行异常捕获和处理
    		try
    		{
    			z = hmean(x,y);
    		}
    		catch (const char * s)
    		{
    			cout << s << endl;
    			cout << "Enter a new pair of numbers:";
    			continue;
    		}
    		cout << "Result:" << z << endl;
    		cout << "Enter next two numbers:";
    	}
    	cout << "Quit";
    }
    

     运行情况如下:

    异常类型可以是字符串或其他C++类型,通常为类类型。

    将类对象作为异常类型的例子:

    class bad_hmean
    {
    private:
    	double v1;
    	double v2;
    public:
    	bad_hmean(int a = 0, int b = 0)
    		:v1(a)
    		,v2(b)
    	{
    
    	}
    	void mesg()
    	{
    		cout << "hmean(" << v1 << "," << v2 << "):" << "Invalid arguments: a = -b
    ";
    	}
    };
    
    //使用异常规范对函数定义进行限定,指出它将引发那些类型的异常
    double hmean(double a,double b) throw(bad_hmean)
    {
    	if (a == -b)
    		throw bad_hmean(a,b);//引发异常
    	return 2.0 * a * b / (a + b);
    }
    
    void test_exception()
    {
    	double x, y, z;
    	cout << "Enter two number:";
    	while (cin >> x >> y)
    	{
    		//使用try catch进行异常捕获和处理
    		try
    		{
    			z = hmean(x,y);
    		}
    		catch (bad_hmean & bh)
    		{
    			bh.mesg();
    			cout << "Enter a new pair of numbers:";
    			continue;
    		}
    		cout << "Result:" << z << endl;
    		cout << "Enter next two numbers:";
    	}
    	cout << "Quit";
    }
    

    2、exception异常类

    在C++中,exception通常作为其他异常类的基类

    C++基本异常类的层次结构:

    exception:

    --logic_error  (典型的逻辑错误)

          domain_error  (参数不在定义的范围)

          invalid_argument (非法的参数)

          length_error (没有足够空间来执行所需操作)

          out_of_bounds (索引错误)

    --runtime_error (运行期间发生但难以预计和防范的错误)

          range_error

      overflow_error

          underflow_error

    --bad_alloc 内存分配导致的异常

    如果上述异常类,无法满足要求,应当从logic_error 或runtime_error派生一个异常类,以确保自定义的异常类可以归入同一个继承层次结构中。

    关于异常需要注意的地方:

    (1)异常规范不适用于模版,因为模版函数引发的异常可能随特定的具体化而异。

    (2)异常处理虽然很重要,但会增加编程的工作量,增大程序,降低程序的速度。

  • 相关阅读:
    【LeetCode 15】三数之和
    【LeetCode 14】最长公共前缀
    【LeetCode 13】罗马数字转整数
    【LeetCode 12】整数转罗马数字
    【LeetCode 11】盛最多水的容器
    【LeetCode 10】正则表达式匹配
    【LeetCode 9】回文数
    【LeetCode 8】字符串转换整数 (atoi)
    【LeetCode 7】整数反转
    【LeetCode 6】Z 字形变换
  • 原文地址:https://www.cnblogs.com/cmranger/p/4138952.html
Copyright © 2011-2022 走看看