Penangan Semua Exception
Termasuk bagian Logika dan Alur dalam perjalanan C++ di Coddy. Pelajaran 52 dari 56.
Terkadang, programmu mungkin mengalami error tak terduga yang tidak cocok dengan tipe pengecualian khusus yang sudah kamu rencanakan. Penangan umum catch(...) menjadi jaring pengaman yang menangkap pengecualian apa pun yang tidak ditangani oleh blok catch yang lebih spesifik.
Handler catch-all menggunakan tiga titik (...), bukan menentukan tipe exception tertentu. Handler ini harus ditempatkan setelah semua blok catch lainnya karena C++ memeriksanya secara berurutan:
try {
// Kode yang mungkin memunculkan berbagai pengecualian
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}Handler catch-all berfungsi sebagai penangan cadangan untuk jenis exception apa pun yang tidak ditangani oleh blok sebelumnya. Handler ini sangat berguna saat kamu bekerja dengan kode yang mungkin memunculkan exception yang tidak kamu perkirakan, sehingga programmu tidak mengalami crash akibat error yang tidak terduga.
Meskipun kamu tidak dapat mengakses detail spesifik dari exception di blok penangkap semua, kamu tetap dapat memberikan pesan error umum dan melakukan operasi pembersihan agar programmu berjalan lancar.
Tantangan
MudahBuat program yang menunjukkan penanganan exception secara menyeluruh menggunakan beberapa blok catch, termasuk handler yang menangani semua jenis exception. Tantangan ini akan menguji pemahamanmu tentang cara menangani jenis exception tertentu dan error tak terduga yang tidak termasuk dalam kategori yang sudah ditentukan.
Input berikut akan diberikan:
- String
testTypeyang menunjukkan jenis tes yang akan dilakukan ("string_convert","math_operation","array_access", atau"unknown_error") - String
value1yang akan digunakan sebagai data utama untuk operasi - String
value2yang akan digunakan sebagai data sekunder untuk beberapa operasi
Programmu harus:
- Membuat fungsi bernama
performTestyang menerima tiga parameter string - Di dalam fungsi, menggunakan struktur if-else untuk menangani jenis tes yang berbeda:
- Jika testType adalah
"string_convert": gunakanstd::stoiuntuk mengonversi value1 menjadi bilangan bulat, lalu cetak hasilnya - Jika testType adalah
"math_operation": konversi value1 dan value2 menjadi bilangan bulat menggunakanstd::stoi, lalu bagi value1 dengan value2 dan cetak hasilnya - Jika testType adalah
"array_access": buat string"Programming", konversi value1 menjadi indeks bilangan bulat menggunakanstd::stoi, lalu gunakanstr.at(index)untuk mengakses karakter pada indeks tersebut dan mencetaknya. Method.at()secara otomatis melemparstd::out_of_rangejika indeks tidak valid, jadi pemeriksaan batas secara manual tidak diperlukan - Jika testType adalah
"unknown_error": lempar nilai bilangan bulat999 - Di fungsi main, panggil
performTestdi dalam bloktry - Gunakan beberapa blok
catchuntuk menangani exception dengan urutan yang persis seperti berikut: - Pertama:
std::invalid_argument&untuk konversi string ke angka yang tidak valid - Kedua:
std::out_of_range&untuk angka yang terlalu besar atau indeks string yang di luar batas - Ketiga:
catch(...)sebagai handler yang menangani semua jenis exception lainnya
Gunakan format output berikut secara persis:
Untuk operasi yang berhasil:
Success: [result_value]Untuk jenis exception yang berbeda:
Invalid argument caught
Out of range caught
Unknown exception caughtIngat, handler yang menangani semua jenis exception, catch(...), harus diletakkan terakhir karena C++ memeriksa blok catch secara berurutan. Handler ini akan menangkap jenis exception apa pun yang tidak ditangani oleh blok catch spesifik sebelumnya, termasuk exception bilangan bulat yang dilempar dalam kasus "unknown_error". Handler yang menangani semua jenis exception menjadi perlindungan untuk error tak terduga sekaligus memungkinkan penanganan khusus untuk jenis exception yang sudah diketahui.
Coba sendiri
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Tulis kodemu di sini, buat fungsi performTest
int main() {
// Baca input
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Tulis kodemu di bawah, terapkan blok try-catch dan panggil performTest
return 0;
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Pointer dan Memori
Apa Itu Pointer?Operator Address-OfOperator DereferencePointer NullPointer dan ArrayMemori Dinamis dengan 'new'Membebaskan Memori dengan 'delete'Rangkuman: Latihan Pointer2Vektor (array Dinamis)
Memperkenalkan std::vectorMembuat VektorMenambahkan ElemenMengakses ElemenUkuran VektorIterasi dengan for loopFor loop Berbasis RentangMenghapus ElemenRangkuman: Operasi Vektor5Proyek: Alat Inventaris
Menyiapkan ProyekMenambahkan dan Memperbarui Barang8Penanganan error Dasar
Pengenalan ExceptionBlok 'try' dan 'catch'Kata Kunci 'throw'Berbagai Tipe ExceptionPenangan Semua ExceptionRingkasan: Pembagian AmanLatihan sendiri: Compiler C++ online