C++ 程式演示異常處理
假設有一個函式計算一些複雜的數學運算。但在運算過程中,可能會發生一些異常。我們必須處理可能發生的各種型別的異常並執行以下操作。
- 如果計算機無法為計算分配記憶體,我們必須列印“記憶體不足!”
- 如果發生任何其他與 C++ 相關的異常,我們必須列印“異常:”,然後是異常。
- 如果發生其他情況,我們列印“未處理的異常”。
我們得到一個包含一對值的陣列,並將其傳遞給函式。如果發生任何異常,我們處理它,否則我們列印輸出值。
我們只需要處理異常,而不用考慮生成異常的函式機制。
因此,如果輸入類似於 arr = {{361643035132, 2297873642249}, {-17, 15}};,則輸出將為 -
Memory Low! Exception: val1 is negative
第一對值過大,無法處理,因此列印“記憶體不足”。第二對的第一個值是負數。提供的函式無法處理該值,因此會生成/丟擲異常“val1 為負數”,
為了解決這個問題,我們將遵循以下步驟 -
- 初始化 i := 0,當 i < t 時,更新(i 增加 1),執行 -
- val1 := values[i, 0]
- val2 := values[i, 1]
- 嘗試,
- 列印(foo(val1, val2))
- 如果無法分配記憶體(捕獲 bad_alloc 異常),則
- 列印("記憶體不足!")
- 否則,如果捕獲任何其他標準 C++ 異常 e,則
- 列印("異常:")
- 列印異常詳細資訊
- 否則,如果捕獲任何其他異常,則
- 列印("未處理的異常")
示例
讓我們看看以下實現以更好地理解 -
#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
#include <vector>
#include <cmath>
using namespace std;
class Solution {
private:
static int value;
public:
static int foo(long long val1, long long val2) {
value += 1;
if(val1 < 0) {
throw std::invalid_argument("val1 is negative");
}
vector<int> vectorList(val1, 0);
int r = -1, c = sqrt(-1);
if(val2 == 0) throw 0;
r = (val1 / val2) * r;
int ans = vectorList.at(val2);
return r + val1 - val2 * ans;
}
static int getVal() {
return value;
}
};
int Solution::value = 0;
void solve(int t, long int values[][2]) {
for (int i = 0; i < t; i++) {
long long val1, val2;
val1 = values[i][0];
val2 = values[i][1];
try {
cout << Solution::foo(val1, val2) << '\n';
}
catch (const std::bad_alloc&) {
cout << "Memory Low!\n";
}
catch (const std::exception& e) {
cout << "Exception: " << e.what() << '\n';
}
catch (...) {
cout << "Unhandled Exception\n";
}
}
}
int main() {
long int arr[][2] = {{361643035132, 2297873642249}, {-17, 15}};
solve(2, arr);
}輸入
long int arr[][2] = {{361643035132, 2297873642249}, {-17, 15}};
solve(2, arr);輸出
Memory Low! Exception: val1 is negative
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP