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.

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.
Blok try berisi kode yang berpotensi gagal, catch menangani tipe exception tertentu, dan finally selalu dieksekusi untuk pembersihan:
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.
Saat domain aplikasi punya kesalahan yang khas, buat exception sendiri dengan mewarisi 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 seperti file dan koneksi database wajib dibebaskan. Sejak C# 8, using declaration membebaskan resource otomatis di akhir scope:
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.
Debugger memungkinkan kalian menghentikan eksekusi di baris tertentu dan memeriksa nilai variabel. Di VS Code, config debug disimpan di file .vscode/launch.json:
{
"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.
Menulis ke console dengan Console.WriteLine tidak cukup untuk aplikasi produksi. Gunakan abstraksi ILogger yang menyediakan level log dan format terstruktur:
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.
Inti yang harus dibawa pulang:
finally untuk pembersihan wajib.Exception dengan pesan yang konsisten.using declaration membebaskan resource secara otomatis.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.