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.
Tantangan
MudahMari 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
FileExceptionyang mewarisistd::exception. Class ini harus menyimpan pesan error dan meng-override methodwhat()dengan penentunoexcept.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 classFileProcessoryang menyimulasikan operasi file dan melempar exception khususmu.FileProcessorharus memiliki methodopenFile(const std::string& filename)yang menyimulasikan pembukaan file:- Jika nama file berisi
missing, lemparFileNotFoundException - Jika nama file berisi
locked, lemparPermissionDeniedException - Jika tidak, kembalikan string
Successfully opened: [filename]
- Jika nama file berisi
main.cpp: Baca satu nama file dari input.Buat
FileProcessordan coba buka file tersebut. Gunakan blok try-catch dengan handler yang diurutkan dari yang paling spesifik hingga paling umum:- Tangkap
FileNotFoundExceptiondan tampilkan:File Error: [message] - Tangkap
PermissionDeniedExceptiondan tampilkan:Access Error: [message] - Tangkap
FileExceptiondan tampilkan:General File Error: [message]
Jika tidak ada exception yang dilempar, tampilkan pesan berhasil yang dikembalikan oleh
openFile().- Tangkap
Contohnya, dengan input report.txt:
Successfully opened: report.txtDengan input missing_data.csv:
File Error: File not found: missing_data.csvDengan input locked_config.ini:
Access Error: Permission denied: locked_config.iniTantangan 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk11Konsep OOP Lanjutan
Komposisi vs PewarisanMixin melalui CRTPIdiom PimplPenghapusan TipeKelas Enum dan Pengetikan KuatPenanganan Pengecualian dalam OOPHierarki Pengecualian Kustom3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online