Lapisan bawah program sering melaporkan kegagalan dengan istilah teknis — FormatException dari int.Parse, misalnya. Lapisan atas membutuhkan konteks yang lebih bermakna: “data penjualan gagal diproses”. Meneruskan exception asli begitu saja membuang konteks; melempar exception baru membuang penyebab asalnya. Properti InnerException menyelesaikan dilema ini: exception baru membawa exception lama di dalamnya.

Membungkus Exception dengan Konteks #

Constructor Exception menyediakan overload kedua parameter: Exception(pesan, exceptionAsal). Exception asal tersimpan di properti InnerException, dan pemanggil akhir dapat membaca rantai penyebab tersebut.

csharp
try
{
    try
    {
        int.Parse("salah format");
    }
    catch (FormatException ex)
    {
        throw new Exception("Gagal memproses data penjualan", ex);
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Pesan utama: {ex.Message}");

    if (ex.InnerException != null)
    {
        Console.WriteLine($"Penyebab asal: {ex.InnerException.Message}");
        Console.WriteLine($"Tipe penyebab: {ex.InnerException.GetType().Name}");
    }
}

Output yang Dihasilkan:

text
Pesan utama: Gagal memproses data penjualan
Penyebab asal: The input string 'salah format' was not in a correct format.
Tipe penyebab: FormatException

Mari kita telaah baris demi baris:

  1. Baris 4-6 (int.Parse("salah format")): Konversi gagal dan runtime melempar FormatException di lapisan dalam.
  2. Baris 8-10 (throw new Exception("Gagal memproses data penjualan", ex)): Blok catch dalam membungkus exception asli: pesan baru menjelaskan konteks kegiatan, dan parameter kedua menyimpan exception asal.
  3. Baris 13-15: Blok catch luar membaca ex.Message — teks konteks yang mudah dipahami pengguna lapisan atas.
  4. Baris 16-20: Pemeriksaan ex.InnerException != null penting karena properti tersebut bernilai null pada exception tanpa pembungkus; di sini nilainya terisi, sehingga pesan dan tipe penyebab asal tercetak utuh.

Rantai Penyebab yang Lebih Panjang #

Pembungkusan boleh berlapis-lapis: setiap lapisan menambahkan konteksnya masing-masing. Untuk menelusuri rantai itu, program membaca InnerException dari luar ke dalam, dan setiap lapisan memeriksa null sebelum lanjut. Apabila penyebab paling dasar dibutuhkan tanpa membongkar rantai satu per satu, method GetBaseException() mengembalikan exception terdalam secara langsung. Jejak lengkapnya juga tercetak otomatis pada call stack — bab Exception StackTrace menunjukkan bentuknya.