try/catch/throw
try/catch/throw try/catch/throw的优点: 1.可以自定义抛出异常之后的操作 2.异常抛出后会一直返回调用函数(或者说上一层函数),直到被catch到,所以便可以统一将catch语句写在一起,使代码更加方便整洁。 1.遇到除0时的异常 void test1() { try { double m, n; cin >> m >> n; if (n == 0) throw -1; if (m == 0) throw - 1.0; cout << m / n << endl; } catch (int i) { cout << `try/catch/throw`是C++中的异常处理机制,用于在程序运行过程中捕获和处理错误。这个机制使得程序员可以在出现异常情况时,优雅地处理错误,而不是让程序突然崩溃。下面我们将深入探讨这些关键字的功能和用法。 1. **自定义异常处理** `try`块用于包含可能引发异常的代码。如果在`try`块内发生异常,程序会立即跳转到相应的`catch`块。这样,你可以为不同类型的异常编写不同的处理逻辑。例如,在`test1()`函数中,如果除数为0,会抛出一个异常,然后通过多个`catch`块来分别处理不同类型的异常,如整数、浮点数或字符串。 2. **异常传播** 当异常被`throw`后,它会向上层调用者传递,直到被某个`catch`块捕获。这允许你在多层调用链中集中处理异常,使代码更整洁。在`help2()`函数中,`throw -1`会跳过该函数内部的`catch`块,继续向上层的`test2()`传递,直到被`catch (...)`捕获。 3. **抛出类实例** 你可以抛出类的实例作为异常,这样在`catch`块中就可以直接捕获并操作该对象。在`help3()`函数中,抛出了一个字符 `'a'`,然后在上层函数中捕获了`Base`类的对象,展示了如何处理不同类型的异常。 4. **自定义异常类和`what()`函数** 你可以创建自己的异常类,继承自`std::exception`。自定义异常类可以覆盖`what()`函数,提供关于异常的更多信息。在`test4()`函数中,创建了一个名为`myException`的类,其`what()`函数返回一个字符串。当抛出`myException`的实例时,`catch`块可以通过调用`what()`获取异常的描述。 5. **异常声明** 使用`throw()`关键字可以在函数声明中指定该函数可能会抛出哪些类型的异常,或者声明它不抛出任何异常。例如,`func()`函数可以声明只抛出`int`和`double`类型的异常,或者声明不抛出任何异常。这有助于编译器进行异常安全性检查。 6. **`catch(...)`** `catch(...)`是一个万能的异常处理器,它可以捕获所有未被其他`catch`块捕获的异常。这是一种备选方案,通常用于记录日志或执行清理操作,因为无法确定具体的异常类型。 异常处理是C++编程中不可或缺的一部分,它提高了程序的健壮性和可维护性。通过合理使用`try/catch/throw`,可以确保程序在遇到错误时能够优雅地处理,而不是简单地崩溃,从而提供更好的用户体验。