jump to navigation

Melontarkan Kembali (Rethrow) Sebuah Exception 13 Juni 2008

Posted by firstyuyu in .net framework.
trackback

Pada beberapa kasus, ketika terjadi exception, kita mungkin ingin melakukan rollback terhadap operasi yang dilakukan untuk menjaga agar state tetap konsisten. Namun kita tidak ingin menanganin exception tersebut karena kita tahu bahwa layer yang lebih tinggi yang akan menanganinya. Di sini, proses yang terjadi ialah kita menangkap exception, melakukan rollback terhadap operasi yang dijalankan, lalu melontarkan kembali (rethrow) exception yang tadi kita tangkap.

Pada kasus seperti ini, kita harus melakukan rethrow terhadap exception untuk menjaga agar stack trace tidak berubah. Stack trace berisi informasi urutan pemanggilan method dari awal hingga terjadinya exception. Dengan melihat informasi di dalam stack trace, kita bisa mengetahui asal sebuah exception sehingga akan mempermudah kita dalam proses debugging.

Berikut ini contoh kode program yang melakukan pelontaran kembali terhadap sebuah exception.

public void DoSomething(FileStream file)

{

    long position = file.Position;

    try

    {

        // lakukan operasi file di sini

    }

    catch

    {

        // saat terjadi kesalahan,

        // kembalikan state ke keadaan semula

        file.Position = position;

 

        // lontarkan kembali exception

        // yang terjadi

        throw;

    }

}

Pada kode di atas, kita menangkap exception menggunakan blok catch tanpa parameter yang akan menangkap semua exception yang terjadi. Hal ini kita lakukan karena kita ingin mengembalikan state ke keadaan semula jika operasi gagal dan terjadi exception. Di sini, tipe exception yang terjadi tidaklah penting bahkan kita juga tidak tahu bagaimana menangani exception yang terjadi. Karena itulah, kita melontarkan kembali (rethrow) exception yang terjadi dan membiarkan layer yang lebih tinggi untuk menanganinya.

Yang perlu kita catat di sini, melontarkan kembali (rethrow) sebuah exception dilakukan dengan statemen throw tanpa parameter. Perhatikan contoh berikut:

class Program

{

    static void Main()

    {

        SomeMethod(null);

    }

 

    static void SomeMethod(Object o)

    {

        try

        {

            DoWork(o);

        }

        catch (ArgumentNullException e)

        {

            Debug.Write(e.Message);

            throw;

        }

    }

 

    static void DoWork(Object o)

    {

        if (o == null)

        {

            throw new ArgumentNullException(“o”);

        }

    }

}

Kode di atas, jika kita jalankan tentu akan mengakibatkan terjadinya ArgumentNullException. Jika kita lihat pada property StackTrace dari exception yang terjadi, maka isinya sbb:



Gambar 01. Isi property StackTrace. (klik untuk memperbesar).

Perhatikan, baris ke-1 hingga ke-3 dengan jelas menyebutkan bahwa exception terjadi diawali di dalam method DoWork, SomeMethod, lalu Main. Tentu ini informasi yang kita harapkan ketika melakukan debugging. Informasi di dalam stack trace akan sangat membantu kita dalam menemukan sumber bug yang terjadi.

Mungkin timbul pertanyaan, bagaimana jika statemen throw di method SomeMethod kita tulis sbb?

throw e;

bukankah ini juga sama-sama melontarkan kembali exception
e? Untuk lebih jelasnya, mari kita coba jalankan kode di atas dengan memberikan parameter e pada statemen throw. Ketika terjadi exception, maka StackTrace yang tampak adalah sbb:



Gambar 02. Isi property StackTrace. (klik untuk memperbesar).

Dari gambar di atas, pada baris ke-1 bisa kita lihat bahwa stack trace mencatat exception dimulai dai method SomeMethod. Ini tentu tidak kita harapkan karena telah menyembunyikan tempat terjadinya exception yang seharusnya terjadi di method DoWork bukan SomeMethod.

Dari sini bisa kita simpulan, bahwa melontarkan kembali sebuah exception (melalui statemen throw tanpa parameter) tidak merubah isi stack trace, dan inilah yang kita harapkan ketika melakukan proses debugging. Di sisi lain, ketika kita melontarkan sebuah exception (menggunakan statemen throw berparameter), maka stack trace akan mencatat bahwa exception terjadi/dimulai dari tempat dimana statemen throw berada. Hal ini bisa membingungkan kita ketika melakukan debugging.

 

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: