Episode ini mengajarkan penanganan error yang benar di C#: try, catch, finally, throw, dan custom exception. Kalian juga belajar using declarations, pola dispose, debugging di VS Code, serta logging dasar dengan Microsoft.Extensions.Logging.

Aplikasi tidak selalu berjalan mulus — file hilang, koneksi terputus, input tidak valid. Episode 6 mengajarkan cara menghadapi situasi ini dengan benar di C#: exception handling, pola dispose untuk sumber daya, teknik debugging di VS Code, dan logging terstruktur.
Tujuan akhirnya bukan menghindari error, melainkan menangani error dengan cara yang terprediksi: aplikasi tidak crash secara liar, sumber daya dibebaskan, dan jejak yang memadai tersedia saat insiden terjadi. Ini adalah prasyarat penting sebelum kalian membangun web API di fase 4.
Blok try membungkus kode yang berpotensi error, catch menangani exception, dan finally selalu dijalankan — baik sukses maupun error:
try
{
var angka = int.Parse("abc");
}
catch (FormatException ex)
{
Console.WriteLine($"Input tidak valid: {ex.Message}");
}
finally
{
Console.WriteLine("Selesai");
}Tangkap exception spesifik seperti FormatException terlebih dahulu, lalu exception umum di belakang. Pesan ex.Message berisi keterangan error; jangan pernah menelan exception tanpa mencatatnya.
Untuk error bisnis, buat exception khusus yang menjelaskan konteks domain:
public class SaldoTidakCukupException : Exception
{
public SaldoTidakCukupException(string pesan) : base(pesan) { }
}
throw new SaldoTidakCukupException("Saldo tidak mencukupi");Custom exception diturunkan dari Exception dan biasanya ditambahkan sebagai class terpisah di folder Exceptions. Gunakan throw untuk melaporkan kondisi yang tidak bisa dipulihkan di tempat itu.
Sumber daya seperti file dan koneksi harus dibebaskan. Using declaration menjamin method Dispose dipanggil saat keluar dari scope:
using var stream = File.Create("catatan.txt");
stream.WriteByte(65);using var stream otomatis memanggil Dispose saat blok berakhir. Sejak C# 8, deklarasi ini lebih ringkas daripada blok using kurung kurawal, dan berlaku untuk semua tipe yang mengimplementasikan IDisposable.
Jika class kalian memegang sumber daya tak terkelola, implementasikan pola ini:
public class KoneksiDb : IDisposable
{
public void Dispose()
{
Console.WriteLine("Koneksi ditutup");
}
}IDisposable memberi sinyal bahwa instance perlu dibebaskan. Sebagian besar sumber daya di ekosistem .NET — koneksi database, stream, HttpClient — sudah mengimplementasikan pola ini, sehingga kalian cukup memakainya bersama using.
Dengan ekstensi C# Dev Kit, VS Code bisa menjalankan debugger .NET. File .vscode/launch.json dibuat otomatis dari template; intinya menargetkan project yang aktif:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Console",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/net8.0/HelloDotnet.dll"
}
]
}Konfigurasi di atas memberitahu debugger assembly mana yang dijalankan. Tekan tombol Run and Debug untuk memulai, lalu klik margin kiri untuk menaruh breakpoint.
Setelah breakpoint aktif, jalankan aplikasi dan perhatikan panel Watch, Variables, dan Call Stack. Gunakan langkah Step Over, Step Into, dan Step Out untuk menelusuri eksekusi. Debugging adalah cara tercepat menemukan di mana state menjadi salah, sebelum kalian memperbaiki penyebabnya.
Daripada Console.WriteLine, aplikasi modern memakai logging provider yang menyediakan level dan struktur. Microsoft.Extensions.Logging adalah standar bawaan .NET:
using Microsoft.Extensions.Logging;
var logger = LoggerFactory.Create(builder =>
builder.AddConsole()).CreateLogger("App");
logger.LogInformation("Aplikasi dimulai");
logger.LogWarning("Memori menipis: {Memori}%", 85);builder.AddConsole() menambahkan console provider, dan logger.LogInformation menulis log berlevel Information. Placeholder seperti {Memori} mengisi nilai tanpa concatenation — menjaga log tetap terstruktur dan mudah diparsing. Episode 20 akan memperluas ini dengan Serilog dan OpenTelemetry.
Warning
Jangan menulis exception di console secara langsung di kode produksi. Selalu lewati ke ILogger dengan level yang sesuai agar tim operasional bisa menemukan dan menganalisis insiden.
Ringkasan praktik yang perlu dibiasakan:
Inti yang harus dibawa pulang:
try, catch, finally menangani error; throw melaporkan kondisi baru.Di episode 7 selanjutnya kita akan membahas I/O dan file handling — System.IO, StreamReader dan StreamWriter, FileStream, serialisasi JSON dengan System.Text.Json, serta konfigurasi file seperti appsettings.json dan environment variable.