Belajar C# - Exception Handling & Debugging
Series/Belajar C#/Episode 6
Episode 6 of 23

Belajar C# - Exception Handling & Debugging

Episode ini membahas cara menangani kegagalan dengan baik: pola try-catch-finally, throw dan custom exception, resource management dengan using declaration, teknik debugging di Visual Studio dan VS Code, serta logging dasar untuk aplikasi produksi.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Aplikasi yang berjalan lama pasti menghadapi kegagalan: koneksi database putus, file tidak ditemukan, input pengguna tidak valid. Perbedaan antara aplikasi profesional dan aplikasi rapuh terletak pada cara menangani kegagalan ini.

Exception handling bukan soal menutup-nutupi error, melainkan soal memutuskan di mana kegagalan boleh terjadi, bagaimana diatasi, dan bagaimana informasi kegagalan dicatat untuk diperbaiki nanti.

Episode 6 ini mengajarkan pola try-catch-finally, cara membuat dan melempar custom exception, pengelolaan resource dengan using, teknik debugging di Visual Studio dan VS Code, serta logging dasar yang menjadi bekal kita di episode 20.

Try-Catch-Finally dan Throw

Pola Dasar Penanganan Error

Blok try berisi kode yang berpotensi gagal, catch menangani tipe exception tertentu, dan finally selalu dieksekusi untuk pembersihan:

Try-catch-finally
try
{
    var pembagi = 0;
    var hasil = 10 / pembagi;
    Console.WriteLine(hasil);
}
catch (DivideByZeroException)
{
    Console.WriteLine("Tidak bisa membagi dengan nol.");
}
finally
{
    Console.WriteLine("Blok ini selalu berjalan.");
}

Tangkap exception se-spesifik mungkin. catch (DivideByZeroException) menangani kasus khusus, sedangkan catch (Exception) yang polos menangkap semua — pakai dengan hati-hati karena bisa menyembunyikan bug nyata.

Membuat Custom Exception

Saat domain aplikasi punya kesalahan yang khas, buat exception sendiri dengan mewarisi Exception:

Custom exception
class StokTidakCukupException : Exception
{
    public StokTidakCukupException(string namaProduk, int sisa)
        : base($"Stok {namaProduk} tidak cukup, sisa {sisa}.") { }
}
 
void KurangiStok(string produk, int jumlah)
{
    throw new StokTidakCukupException(produk, 0);
}
 
try
{
    KurangiStok("Kopi", 5);
}
catch (StokTidakCukupException ex)
{
    Console.WriteLine(ex.Message);
}

Custom exception memakai pola constructor base seperti di atas, sehingga pesan error selalu konsisten dan bisa diperiksa di level atas aplikasi.

Resource Management dengan Using

Using Declaration

Resource seperti file dan koneksi database wajib dibebaskan. Sejak C# 8, using declaration membebaskan resource otomatis di akhir scope:

Using declaration
using var writer = new StreamWriter("catatan.txt");
writer.WriteLine("Baris pertama");
writer.WriteLine("Baris kedua");

Saat eksekusi keluar dari method, object StreamWriter otomatis di-dispose oleh compiler. Tidak ada finally manual, tidak ada resource bocor. Detail file I/O ini akan kita perdalam di episode 7.

Debugging di Visual Studio dan VS Code

Breakpoint dan Inspect Variabel

Debugger memungkinkan kalian menghentikan eksekusi di baris tertentu dan memeriksa nilai variabel. Di VS Code, config debug disimpan di file .vscode/launch.json:

Konfigurasi debug VS Code
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C# Console",
      "type": "coreclr",
      "request": "launch",
      "preLaunchTask": "build",
      "program": "${workspaceFolder}/bin/Debug/net8.0/Aplikasi.dll",
      "args": [],
      "cwd": "${workspaceFolder}"
    }
  ]
}

Konfigurasi "request": "launch" di atas memulai program dalam mode debug dengan breakpoint aktif. Di Visual Studio, tekan F9 untuk menandai breakpoint dan F5 untuk mulai debugging.

Logging Dasar

Microsoft.Extensions.Logging

Menulis ke console dengan Console.WriteLine tidak cukup untuk aplikasi produksi. Gunakan abstraksi ILogger yang menyediakan level log dan format terstruktur:

Logging dengan ILogger
using var loggerFactory = LoggerFactory.Create(b =>
    b.AddConsole().SetMinimumLevel(LogLevel.Information));
 
var logger = loggerFactory.CreateLogger("Aplikasi");
logger.LogInformation("Aplikasi mulai pada {Waktu}", DateTime.Now);
logger.LogWarning("Stok produk {Produk} menipis.", "Kopi");
logger.LogError("Gagal terhubung ke database.");

Placeholder seperti {Waktu} membuat log menjadi terstruktur — bukan sekadar teks — sehingga bisa di-query nanti. Level log dari rendah ke tinggi: Trace, Debug, Information, Warning, Error, Critical.

Penutup

Inti yang harus dibawa pulang:

  • Tangkap exception sespesifik mungkin; finally untuk pembersihan wajib.
  • Custom exception mewarisi Exception dengan pesan yang konsisten.
  • using declaration membebaskan resource secara otomatis.
  • Breakpoint dan inspect variabel adalah cara tercepat memahami bug.
  • Log terstruktur dengan ILogger lebih baik dari Console.WriteLine.

Di episode 7 selanjutnya kita berurusan dengan data di luar memori: input/output dan file handling — System.IO dengan File, Directory, dan Path, stream dan StreamReader/Writer, serialisasi JSON dan XML, serta konsep asynchronous I/O dengan async/await.

Belajar C# - Exception Handling & Debugging | Belajar C#