`
universsky
  • 浏览: 99420 次
文章分类
社区版块
存档分类
最新评论

C++ : EXCEPTIONS

 
阅读更多

Exceptions

Exceptions provide a way to react to exceptional circumstances (like runtime errors) in our program by transferring control to special functions called handlers.

To catch exceptions we must place a portion of code under exception inspection. This is done by enclosing that portion of code in a try block. When an exceptional circumstance arises within that block, an exception is thrown that transfers the control to the exception handler. If no exception is thrown, the code continues normally and all handlers are ignored.

An exception is thrown by using the throw keyword from inside the try block. Exception handlers are declared with the keyword catch, which must be placed immediately after the try block:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// exceptions
#include <iostream>
using namespace std;

int main () {
  try
  {
    throw 20;
  }
  catch (int e)
  {
    cout << "An exception occurred. Exception Nr. " << e << endl;
  }
  return 0;
}
An exception occurred. Exception Nr. 20


The code under exception handling is enclosed in a try block. In this example this code simply throws an exception:

throw 20;


A throw expression accepts one parameter (in this case the integer value 20), which is passed as an argument to the exception handler.

The exception handler is declared with the catch keyword. As you can see, it follows immediately the closing brace of the try block. The catch format is similar to a regular function that always has at least one parameter. The type of this parameter is very important, since the type of the argument passed by the throw expression is checked against it, and only in the case they match, the exception is caught.

We can chain multiple handlers (catch expressions), each one with a different parameter type. Only the handler that matches its type with the argument specified in the throw statement is executed.

If we use an ellipsis (...) as the parameter of catch, that handler will catch any exception no matter what the type of the throw exception is. This can be used as a default handler that catches all exceptions not caught by other handlers if it is specified at last:

1
2
3
4
5
6
try {
  // code here
}
catch (int param) { cout << "int exception"; }
catch (char param) { cout << "char exception"; }
catch (...) { cout << "default exception"; }


In this case the last handler would catch any exception thrown with any parameter that is neither an int nor a char.

After an exception has been handled the program execution resumes after the try-catch block, not after the throw statement!.

It is also possible to nest try-catch blocks within more external try blocks. In these cases, we have the possibility that an internal catch block forwards the exception to its external level. This is done with the expression throw; with no arguments. For example:

1
2
3
4
5
6
7
8
9
10
11
try {
  try {
      // code here
  }
  catch (int n) {
      throw;
  }
}
catch (...) {
  cout << "Exception occurred";
}


Exception specifications


When declaring a function we can limit the exception type it might directly or indirectly throw by appending a throw suffix to the function declaration:

float myfunction (char param) throw (int);


This declares a function called myfunction which takes one argument of type char and returns an element of type float. The only exception that this function might throw is an exception of type int. If it throws an exception with a different type, either directly or indirectly, it cannot be caught by a regular int-type handler.

If this throw specifier is left empty with no type, this means the function is not allowed to throw exceptions. Functions with no throw specifier (regular functions) are allowed to throw exceptions with any type:

1
2
int myfunction (int param) throw(); // no exceptions allowed
int myfunction (int param);         // all exceptions allowed 


Standard exceptions

The C++ Standard library provides a base class specifically designed to declare objects to be thrown as exceptions. It is called exception and is defined in the <exception> header file under the namespace std. This class has the usual default and copy constructors, operators and destructors, plus an additional virtual member function called what that returns a null-terminated character sequence (char *) and that can be overwritten in derived classes to contain some sort of description of the exception.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// standard exceptions
#include <iostream>
#include <exception>
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex;

int main () {
  try
  {
    throw myex;
  }
  catch (exception& e)
  {
    cout << e.what() << endl;
  }
  return 0;
}
My exception happened.


We have placed a handler that catches exception objects by reference (notice the ampersand & after the type), therefore this catches also classes derived from exception, like our myex object of class myexception.

All exceptions thrown by components of the C++ Standard library throw exceptions derived from this std::exception class. These are:

exception description
bad_alloc thrown by new on allocation failure
bad_cast thrown by dynamic_cast when fails with a referenced type
bad_exception thrown when an exception type doesn't match any catch
bad_typeid thrown by typeid
ios_base::failure thrown by functions in the iostream library

For example, if we use the operator new and the memory cannot be allocated, an exception of type bad_alloc is thrown:

1
2
3
4
5
6
7
8
try
{
  int * myarray= new int[1000];
}
catch (bad_alloc&)
{
  cout << "Error allocating memory." << endl;
}


It is recommended to include all dynamic memory allocations within a try block that catches this type of exception to perform a clean action instead of an abnormal program termination, which is what happens when this type of exception is thrown and not caught. If you want to force a bad_alloc exception to see it in action, you can try to allocate a huge array; On my system, trying to allocate 1 billion ints threw a bad_alloc exception.

Because bad_alloc is derived from the standard base class exception, we can handle that same exception by catching references to the exception class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// bad_alloc standard exception
#include <iostream>
#include <exception>
using namespace std;

int main () {
  try
  {
    int* myarray= new int[1000];
  }
  catch (exception& e)
  {
    cout << "Standard exception: " << e.what() << endl;
  }
  return 0;
}
分享到:
评论

相关推荐

    Applied C++: practical techniquest for Building Better Software

    A C++ templates primer  Workable coding guidelines and extensive coding examples  Quick lists of need-to-know information about Exceptions, Assertions, and Standard Template Library components ...

    source insight 4.0.0089

    Fix: C++: lambda functions: misc fixes: capture variables by reference, trailing return types, specifiers and exceptions. Fix: C++: fix to pointer dereference using std::unique_ptr. Fix: Search ...

    SourceInsight4.0.0089

    4. C++: lambda functions: misc fixes: capture variables by reference, trailing return types, specifiers and exceptions. 5. C++: fix to pointer dereference using std::unique_ptr. 6. Search Results: ...

    C++ Crash Course- A Fast-Paced Introduction 2019.rar

    The object lifecycle including storage duration, memory management, exceptions, call stacks, and the RAII paradigm Compile-time polymorphism with templates and run-time polymorphism with virtual ...

    C++文件读写操作C++文件读写操作

    C++11引入了`std::ifstream::exceptions()`和`std::ofstream::exceptions()`,可以设置在发生特定错误时抛出异常,而不是仅仅设置错误标志。 10. **实例应用**: - `C++获取计算机名.txt`可能包含如何使用C++获取...

    Thinking in C++.pdf

    - 异常处理(Exceptions):阐述了异常处理机制及其对程序健壮性的影响。 - 多重继承(Multiple Inheritance):探讨了多重继承带来的挑战和解决方案。 4. **标准库与I/O流**:提供了关于C++标准库的详细介绍,...

    Effective.C++中文版

    《Effective C++:改善程序与设计的55个具体做法》(中文版)(第3版)一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论...

    C++完全帮助文档(手册)

    C++ Exceptions * Complex Numbers C++ Standard Template Library (STL) * Overview * C++ Algorithms * C++ Vectors * C++ Double-Ended Queues * C++ Lists * C++ Priority Queues * C++ ...

    C++17 标准 ISOIEC 14882 2017 官方pdf文档

    In addition to the facilities provided by C, C++ provides additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store ...

    Problem Solving with C++ (7th edition)

    - **Exception Handling**: Explanation of exception handling mechanisms in C++, including try-catch blocks and throwing exceptions. - **Namespaces and Templates**: Further discussion of namespaces and ...

    C++/CLI教程

    15. 异常处理(Exceptions):异常处理在.NET中是一个重要的概念,C++/CLI同样支持try、catch和finally块来处理运行时错误。 16. 数组(Arrays):包括本地数组(native arrays)和托管数组(managed arrays),在...

    effective c++ 3rd英文版

    Topics from the second edition have been extensively revised to reflect modern design considerations, including exceptions, design patterns, and multithreading.Important features of Effective C++ ...

    gcc-c++工具rpm 安装包

    7. **异常处理**:C++支持异常处理,GCC会根据`-fno-exceptions`和`-fexceptions`选项决定是否启用异常处理。 8. **多线程支持**:C++11引入了标准的线程库,GCC会根据`-pthread`选项链接必要的线程库。 9. **代码...

    C++ How to Program, 10th Edition

    Catching Exceptions 8 Pointers 9 Classes:A Deeper Look 10 Operator Overloading;Class string 11 Object-Oriented Programming:Inheritance 12 Object-Oriented Programming:Polymorphism 13 Stream Input/...

    c++课件第十一章C++输入输出流共11页.pdf.zip

    例如,`std::ios_base::exceptions()`可以设置流在遇到错误时抛出异常。 10. **流缓冲区**:在实际操作中,流的数据传输往往是通过缓冲区进行的,这样可以提高效率。可以使用`std::flush`操作符或`std::endl`来强制...

    Practical C++ Programming C++编程实践

    Exceptions Adding Exceptions to the Stack Class Exceptions Versus assert Programming Exercises 23. Modular Programming Modules Public and Private The extern Storage Class Headers The Body of the ...

    Effective C++ 中文版

    为反映出现代设计考虑,对第二版论题做了广泛的修订,包括异常(exceptions)、设计模式(design patterns)和多线程(multithreading)。  《Effective C++中文版(第3版改善程序与设计的55个具体做法)》的重要...

Global site tag (gtag.js) - Google Analytics