Pesan “terjadi galat” tanpa petunjuk lokasi memaksa kita menebak-nebak. Exception membawa informasi yang jauh lebih berguna: StackTrace — daftar method yang sedang berjalan saat kegagalan terjadi, dari titik kegagalan hingga titik masuk program. Bab ini melatih kita membaca jejak itu, pertama dari pesan unhandled exception, lalu dari properti StackTrace di blok catch.
Membaca Jejak Call Stack #
// Program: exception tidak ditangani, runtime mencetak stack trace
class Program
{
static void Main()
{
int hargaSatuan = HitungHargaSatuan(50000, 0);
Console.WriteLine($"Harga satuan: {hargaSatuan}");
}
static int HitungHargaSatuan(int total, int jumlahUnit)
{
return Bagi(total, jumlahUnit);
}
static int Bagi(int pembilang, int penyebut)
{
return pembilang / penyebut;
}
}Output yang Dihasilkan:
Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
at Program.Bagi(Int32 pembilang, Int32 penyebut) in Program.cs:line 17
at Program.HitungHargaSatuan(Int32 total, Int32 jumlahUnit) in Program.cs:line 12
at Program.Main() in Program.cs:line 6Jalur file pada tiap baris dipangkas agar ringkas; di komputer Anda, runtime mencantumkan jalur lengkap project. Mari kita baca jejaknya:
at Program.Bagi ... line 17: Baris paling atas menunjuk titik kegagalan — pembagianpembilang / penyebutdengan penyebut nol di dalam methodBagi.at Program.HitungHargaSatuan ... line 12: Baris kedua menjelaskan siapa yang memanggilBagi: methodHitungHargaSatuan, tepat pada barisreturn-nya.at Program.Main() ... line 6: Baris terakhir menunjuk titik masuk program yang memulai seluruh rantai.
Dibaca dari bawah ke atas, jejak itu menceritakan urutan panggilan: Main → HitungHargaSatuan → Bagi. Dibaca dari atas, kita langsung berpapasan dengan lokasi kegagalan.
Menampilkan StackTrace di Catch #
Saat exception ditangkap, jejaknya tetap tersimpan dan dapat dibaca lewat properti StackTrace.
// Program: exception ditangkap, properti StackTrace dibaca
class Program
{
static void Main()
{
try
{
int hargaSatuan = HitungHargaSatuan(50000, 0);
Console.WriteLine($"Harga satuan: {hargaSatuan}");
}
catch (DivideByZeroException ex)
{
Console.WriteLine($"Galat: {ex.Message}");
Console.WriteLine("--- Nilai ex.StackTrace ---");
Console.WriteLine(ex.StackTrace);
}
}
static int HitungHargaSatuan(int total, int jumlahUnit)
{
return Bagi(total, jumlahUnit);
}
static int Bagi(int pembilang, int penyebut)
{
return pembilang / penyebut;
}
}Output yang Dihasilkan:
Galat: Attempted to divide by zero.
--- Nilai ex.StackTrace ---
at Program.Bagi(Int32 pembilang, Int32 penyebut) in Program.cs:line 26
at Program.HitungHargaSatuan(Int32 total, Int32 jumlahUnit) in Program.cs:line 21
at Program.Main() in Program.cs:line 8Objek exception merekam jejaknya saat dilempar, bukan saat dibaca. Karena itu, rethrow dengan throw; mempertahankan jejak asli, sedangkan throw ex; menimpanya dan membuat baris kegagalan asli hilang dari daftar.
Dalam pekerjaan sehari-hari, StackTrace paling sering dibaca dalam dua situasi. Pertama, saat laporan galat dari pengguna mencantumkan pesan unhandled exception: baris teratas langsung menunjuk method yang perlu diperbaiki. Kedua, saat pencatatan log di blok catch: menyertakan ex.StackTrace menjadikan catatan tersebut dapat ditelusuri tanpa perlu menjalankan ulang program.
Membaca jejak juga punya pola yang mudah diingat: method yang berada paling atas adalah lokasi kegagalan, method yang berada paling bawah adalah titik masuk, dan setiap baris di antaranya adalah satu lapisan pemanggil. Nomor baris merujuk pada berkas sumber saat program dikompilasi, sehingga angka tersebut dapat dibuka langsung di editor.