Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Buat 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 testType yang menunjukkan jenis tes yang akan dilakukan ("string_convert", "math_operation", "array_access", atau "unknown_error")
  • String value1 yang akan digunakan sebagai data utama untuk operasi
  • String value2 yang akan digunakan sebagai data sekunder untuk beberapa operasi

Programmu harus:

  1. Membuat fungsi bernama performTest yang menerima tiga parameter string
  2. Di dalam fungsi, menggunakan struktur if-else untuk menangani jenis tes yang berbeda:
  3. Jika testType adalah "string_convert": gunakan std::stoi untuk mengonversi value1 menjadi bilangan bulat, lalu cetak hasilnya
  4. Jika testType adalah "math_operation": konversi value1 dan value2 menjadi bilangan bulat menggunakan std::stoi, lalu bagi value1 dengan value2 dan cetak hasilnya
  5. Jika testType adalah "array_access": buat string "Programming", konversi value1 menjadi indeks bilangan bulat menggunakan std::stoi, lalu gunakan str.at(index) untuk mengakses karakter pada indeks tersebut dan mencetaknya. Method .at() secara otomatis melempar std::out_of_range jika indeks tidak valid, jadi pemeriksaan batas secara manual tidak diperlukan
  6. Jika testType adalah "unknown_error": lempar nilai bilangan bulat 999
  7. Di fungsi main, panggil performTest di dalam blok try
  8. Gunakan beberapa blok catch untuk menangani exception dengan urutan yang persis seperti berikut:
  9. Pertama: std::invalid_argument& untuk konversi string ke angka yang tidak valid
  10. Kedua: std::out_of_range& untuk angka yang terlalu besar atau indeks string yang di luar batas
  11. 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 caught

Ingat, 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler C++ online