jump to navigation

Exception Design (Bagian 05) – Penanganan Exception (Exception Handling) 14 Juni 2008

Posted by firstyuyu in Exception Design.
trackback

Setelah kita mengetahui kapan harus melontarkan exception, tipe exception apa yang harus dilontarkan, serta bagaimana membuat pesan exception, maka pada pembahasan kali ini kita akan memfokuskan diri untuk membahas bagaimana menangani exception yang terjadi. Pertama, kita definisikan dahulu beberapa terminologi berkaitan dengan penanganan exception.

Kita dikatakan “menangani exception” ketika kita mempunyai sebuah blok catch yang akan menangkap tipe exception tertentu dan kita benar-benar mengetahui apa implikasi yang akan terjadi jika kita melanjutkan eksekusi aplikasi setelah blok catch tersebut. Sebagai contoh, ketika kita berusaha membuka file konfigurasi, kita menambahkan blok catch yang akan menangkap FileNotFoundException jika file yang akan dibuka tidak ada. Karena kita menangani FileNotFoundException (dengan menambahkan blok catch), maka kita harus tahu apa yang seharusnya dilakukan ketika terjadi exception ini. Misalnya kita akan kembali ke konfigurasi default.

Kita dikatakan “menelan exception” ketika kita menangkap tipe exception yang umum tanpa melakukan apapun dan langsung melanjutkan eksekusi aplikasi.

Jangan:
menelan exception dengan menangkap exception yang tidak spesifik, seperti System.Exception, System.SystemException, dll seperti terlihat pada kode berikut:

try

{

    File.Open(…);

}

catch (Exception e) { }

// Menelan semua exception.

// Jangan lakukan ini!

Pada beberapa kasus, menelan exception di level kode aplikasi mungkin bisa diterima. Namun kasus seperti ini sangat jarang. Jadi panduan ini berlaku untuk hampir semua kode program yang kita tulis.

Kode di atas biasanya ditulis oleh developer yang malas dan tidak ingin pusing dengan kesalahan yang terjadi. Dengan menulis kode di atas, jika terjadi exception, maka exception tersebut akan hilang ditelan oleh blok catch sehingga pemakai akan melihat bahwa aplikasi seolah-olah berjalan normal dan tidak ada kesalahan yang terjadi.

Namun kita harus sadar bahwa ketika kita memutuskan untuk menelan exception, maka kita tidak akan pernah tahu apa sebenarnya kesalahan yang terjadi. Kita tidak akan bisa memprediksi, state yang mana dari aplikasi kita yang menjadi tidak konsisten karena kesalahan yang terjadi.

Banyak konsekuensi yang harus kita terima di sini, mulai dari bug yang sulit dilacak hingga terjadinya lubang keamanan (security hole) yang mungkin bisa terjadi karena state yang tidak konsisten tersebut.

Pertimbangkan:
untuk menangkap exception yang spesifik ketika kita benar-benar mengetahui mengapa exception tersebut bisa terjadi dan bagaimana merespon terhadap kesalahan yang terjadi.

Kita seharusnya hanya menangkap exception yang kita tahu apa yang harus kita lakukan untuk mengatasi kesalahan yang terjadi. Ketika menjalan sebuah operasi, kita mungkin tahu mengapa sebuah exception terjadi tapi tidak mengetahui bagaimana cara mengatasi kesalahan yang terjadi. Pada kasus seperti ini, biarkan saja exception tersebut. Jangan ditangkap.

Lakukan:
Gunakan blok try-finally untuk cleanup code.

Cleanup code digunakan untuk membersihkan resource yang digunakan dalam sebuah operasi. Cleanup code harus dijalankan baik operasi yang dilakukan berhasil atau gagal (terjadi exception). Hal ini untuk menjamin state yang konsisten serta menghindari resource leak. Contoh cleanup code seperti tampak pada kode berikut:

FileStream stream = null;

try

{

    stream = new FileStream(…);

   

}

finally

{

    if (stream != null) stream.Close();

}

C# dan VB.NET juga menyediakan statemen using yang bisa digunakan untuk membersihkan resource milik obyek yang mengimplementasikan interface IDisposable. Karena kelas FileStream mengimplementasikan interface IDisposable, maka kode di atas bisa juga ditulis sbb.

using (FileStream stream = new FileStream(…))

{

   

} 

Lakukan:
Gunakan statement throw tanpa parameter untuk melontarkan kembali exception yang ditangkap. Hal ini penting untuk menjaga stack trace tetap seperti semula.

public void DoSomething(FileStream file)

{

    long position = file.Position;

    try

    {

        // lakukan operasi file di sini

    }

    catch

    {

        // saat terjadi kesalahan,

        // kembalikan ke keadaan semula

        file.Position = position;

 

        // lontarkan kembali exception

        // yang terjadi

        throw;

    }

}

Ketika kita melontarkan sebuah exception (bukan melontarkan kembali exception yang asli), kita sebenarnya telah melaporkan kesalahan yang berbeda dari kesalahan aslinya. Hal ini karena ketika kita melontarkan sebuah exception, maka stack trace akan mencatat bahwa exception terjadi pada tempat dimana statement throw berada. Untuk lebih jelasnya, baca artikel Melontarkan Kembali (Rethrow) Sebuah Exception

Iklan

Komentar»

No comments yet — be the first.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: