Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ สาธิตการจัดการข้อยกเว้น


สมมติว่ามีฟังก์ชันที่คำนวณการดำเนินการทางคณิตศาสตร์ที่ซับซ้อนอย่างร้ายแรง แต่ระหว่างการดำเนินการ อาจมีข้อยกเว้นบางประการ เราต้องจัดการกับข้อยกเว้นประเภทต่างๆ ที่อาจเกิดขึ้นและดำเนินการดังต่อไปนี้

  • หากคอมพิวเตอร์ไม่สามารถจัดสรรหน่วยความจำสำหรับการคำนวณได้ เราต้องพิมพ์ 'Memory Low!'
  • หากมีข้อยกเว้นอื่นๆ ที่เกี่ยวข้องกับ C++ เราต้องพิมพ์ 'Exception:' ตามด้วยข้อยกเว้น
  • หากมีอย่างอื่นเกิดขึ้น เราจะพิมพ์ 'Unhandled exception'.

เราได้รับอาร์เรย์ที่มีค่าคู่หนึ่งและเราส่งต่อไปยังฟังก์ชัน หากมีข้อยกเว้นใดๆ เกิดขึ้น เราจะจัดการกับมัน หรือมิฉะนั้น เราจะพิมพ์ค่าผลลัพธ์

เราต้องจัดการกับข้อยกเว้นโดยไม่คำนึงถึงกลไกของฟังก์ชันที่สร้างข้อยกเว้นเท่านั้น

ดังนั้น หากอินพุตเป็นเหมือน arr ={{361643035132, 2297873642249}, {-17, 15}}; ผลลัพธ์จะเป็น −

Memory Low!
Exception: val1 is negative

ค่าคู่แรกมีขนาดใหญ่เกินกว่าจะจัดการได้ ดังนั้นจึงพิมพ์ 'หน่วยความจำเหลือน้อย' ค่าแรกของคู่ที่สองเป็นค่าลบ ฟังก์ชันที่ให้ไว้ไม่สามารถทำงานได้ดังนั้นจึงสร้าง/ส่งข้อยกเว้น 'val1 เป็นค่าลบ'

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สำหรับการเริ่มต้น i :=0, เมื่อ i
  • val1 :=ค่า[i, 0]
  • val2 :=ค่า[i, 1]
  • ลองดู
    • print(foo(val1, val2))
  • หากไม่สามารถจัดสรรหน่วยความจำได้ (ตรวจพบข้อยกเว้น bad_alloc) แล้ว
    • print("หน่วยความจำเหลือน้อย!")
  • มิฉะนั้น หากตรวจพบข้อยกเว้น C++ มาตรฐานอื่นๆ แล้ว
    • print("ข้อยกเว้น:")
    • พิมพ์รายละเอียดของข้อยกเว้น
  • มิฉะนั้น หากตรวจพบข้อยกเว้นอื่นๆ แล้ว
    • print("ข้อยกเว้นที่ไม่สามารถจัดการได้")

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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