Menu
CoddyTech

Hierarki Pengecualian Kustom

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 82 dari 104.

Meskipun standard library menyediakan class exception yang berguna seperti std::runtime_error, aplikasi di dunia nyata sering kali mendapat manfaat dari pembuatan hierarki exception khusus. Dengan mendefinisikan class exception sendiri yang mewarisi exception standar, kamu dapat membuat tipe error khusus domain yang membawa konteks tambahan dan memungkinkan penanganan error yang lebih tepat.

class exception kustom biasanya mewarisi dari std::exception atau salah satu class turunannya, lalu menimpa method what():

#include <exception>
#include <string>

class DatabaseException : public std::exception {
    std::string message;
public:
    DatabaseException(const std::string& msg) : message(msg) {}
    const char* what() const noexcept override { return message.c_str(); }
};

class ConnectionException : public DatabaseException {
public:
    ConnectionException(const std::string& host) 
        : DatabaseException("Failed to connect to: " + host) {}
};

class QueryException : public DatabaseException {
public:
    QueryException(const std::string& query) 
        : DatabaseException("Invalid query: " + query) {}
};

Hierarki ini memungkinkan blok catch menangani exception dengan tingkat kekhususan yang berbeda:

try {
    // operasi database...
    throw ConnectionException("localhost");
} catch (const ConnectionException& e) {
    std::cout << "Connection issue: " << e.what() << "\n";
} catch (const DatabaseException& e) {
    std::cout << "Database error: " << e.what() << "\n";
} catch (const std::exception& e) {
    std::cout << "General error: " << e.what() << "\n";
}

Specifier noexcept pada what() penting. Specifier ini menjamin bahwa method tersebut tidak akan melempar exception, yang diwajibkan oleh antarmuka base class. Urutkan blok catch dari yang paling spesifik hingga yang paling umum, karena C++ menggunakan handler pertama yang cocok.

challenge icon

Tantangan

Mudah

Mari buat sistem pemrosesan file dengan hierarki exception khusus yang menangani berbagai jenis error terkait file. Kamu akan membuat exception khusus domain yang mewarisi class exception dasar, sehingga kamu dapat menangani error secara tepat pada berbagai tingkat kekhususan.

Kamu akan mengatur kodemu dalam tiga file:

  • FileExceptions.h: Definisikan hierarki exception khusus untuk operasi file.

    Buat class dasar FileException yang mewarisi std::exception. Class ini harus menyimpan pesan error dan meng-override method what() dengan penentu noexcept.

    Lalu buat dua class exception turunan:

    • FileNotFoundException: menerima nama file dan membuat pesan: File not found: [filename]
    • PermissionDeniedException: menerima nama file dan membuat pesan: Permission denied: [filename]

    Setiap class turunan harus memanggil konstruktor induknya dengan pesan yang sesuai.

  • FileProcessor.h: Definisikan class FileProcessor yang menyimulasikan operasi file dan melempar exception khususmu.

    FileProcessor harus memiliki method openFile(const std::string& filename) yang menyimulasikan pembukaan file:

    • Jika nama file berisi missing, lempar FileNotFoundException
    • Jika nama file berisi locked, lempar PermissionDeniedException
    • Jika tidak, kembalikan string Successfully opened: [filename]
  • main.cpp: Baca satu nama file dari input.

    Buat FileProcessor dan coba buka file tersebut. Gunakan blok try-catch dengan handler yang diurutkan dari yang paling spesifik hingga paling umum:

    1. Tangkap FileNotFoundException dan tampilkan: File Error: [message]
    2. Tangkap PermissionDeniedException dan tampilkan: Access Error: [message]
    3. Tangkap FileException dan tampilkan: General File Error: [message]

    Jika tidak ada exception yang dilempar, tampilkan pesan berhasil yang dikembalikan oleh openFile().

Contohnya, dengan input report.txt:

Successfully opened: report.txt

Dengan input missing_data.csv:

File Error: File not found: missing_data.csv

Dengan input locked_config.ini:

Access Error: Permission denied: locked_config.ini

Tantangan ini menunjukkan bagaimana hierarki exception khusus memungkinkan kamu menangani error dengan tingkat detail yang sesuai: tangkap exception spesifik saat kamu membutuhkan penanganan yang tepat, atau tangkap exception dasar saat kamu ingin menangani semua error file secara seragam.

Coba sendiri

#include <iostream>
#include <string>
#include "FileExceptions.h"
#include "FileProcessor.h"

using namespace std;

int main() {
    string filename;
    cin >> filename;
    
    FileProcessor processor;
    
    // TODO: Gunakan blok try-catch untuk menangani pengecualian
    // Urutkan penangan dari yang paling spesifik hingga yang paling umum:
    // 1. Tangkap FileNotFoundException, cetak: "File Error: [message]"
    // 2. Tangkap PermissionDeniedException, cetak: "Access Error: [message]"
    // 3. Tangkap FileException, cetak: "General File Error: [message]"
    // Jika tidak ada pengecualian, cetak pesan keberhasilan dari openFile()
    
    try {
        // TODO: Panggil processor.openFile() dan tangani hasilnya
        
    }
    // TODO: Tambahkan blok catch dari yang paling spesifik hingga yang paling umum
    
    return 0;
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online