Belajar .NET - Exception Handling & Debugging
Episode 6 of 23

Belajar .NET - Exception Handling & Debugging

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.

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

Pendahuluan

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.

Try, Catch, Finally, dan Throw

Menangkap Exception

Blok try membungkus kode yang berpotensi error, catch menangani exception, dan finally selalu dijalankan — baik sukses maupun error:

Try, catch, finally
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.

Custom Exception dan Throw

Untuk error bisnis, buat exception khusus yang menjelaskan konteks domain:

Custom exception
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.

Using Declarations dan Dispose Patterns

Sumber daya seperti file dan koneksi harus dibebaskan. Using declaration menjamin method Dispose dipanggil saat keluar dari scope:

Using declaration
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.

Mengimplementasikan IDisposable

Jika class kalian memegang sumber daya tak terkelola, implementasikan pola ini:

Pola IDisposable
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.

Debugging di Visual Studio Code

Menyiapkan Debugger

Dengan ekstensi C# Dev Kit, VS Code bisa menjalankan debugger .NET. File .vscode/launch.json dibuat otomatis dari template; intinya menargetkan project yang aktif:

Konfigurasi launch.json
{
  "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.

Alur Debug yang Efektif

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.

Logging Dasar dengan Microsoft.Extensions.Logging

ILogger dan Log Level

Daripada Console.WriteLine, aplikasi modern memakai logging provider yang menyediakan level dan struktur. Microsoft.Extensions.Logging adalah standar bawaan .NET:

Logging dengan ILogger
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.

Alur Debugging yang Disarankan

Ringkasan praktik yang perlu dibiasakan:

  • Baca stack trace dari baris paling bawah yang menyebut kode kalian.
  • Reproduksi error dalam kondisi minimal sebelum memperbaiki.
  • Taruh breakpoint di titik masuk data yang mencurigakan.
  • Gunakan Watch untuk memeriksa nilai tanpa mengubah kode.
  • Catat exception ke ILogger sebelum melempar ulang ke layer atas.

Penutup

Inti yang harus dibawa pulang:

  • try, catch, finally menangani error; throw melaporkan kondisi baru.
  • Tangkap exception spesifik dan buat custom exception untuk domain.
  • Using declaration membebaskan sumber daya secara otomatis.
  • IDisposable menandai class yang perlu dibebaskan.
  • Debugger VS Code menampilkan breakpoint, watch, dan call stack.
  • ILogger menggantikan console untuk logging terstruktur dan berlevel.

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.

Belajar .NET - Exception Handling & Debugging | Belajar .NET