Bagikan melalui


Mengelola pengecualian dengan debugger di Visual Studio

Pengecualian adalah indikasi status kesalahan yang terjadi saat program sedang dijalankan. Anda dapat memberi tahu debugger pengecualian atau set pengecualian mana yang harus dilanggar, dan pada titik mana Anda ingin debugger dipecah (yaitu, jeda di debugger). Ketika debugger dilanggar, itu menunjukkan kepada Anda di mana pengecualian muncul. Anda juga dapat menambahkan atau menghapus pengecualian. Dengan solusi terbuka di Visual Studio, gunakan Debug > Windows > Pengaturan Pengecualian untuk membuka jendela Pengaturan Pengecualian.

Berikan penanganan yang merespons pengecualian terpenting. Jika Anda perlu mengetahui cara menambahkan penanganan untuk pengecualian, lihat Memperbaiki bug dengan menulis kode C# yang lebih baik. Selain itu, pelajari cara mengonfigurasi debugger untuk selalu memutuskan eksekusi untuk beberapa pengecualian.

Saat pengecualian terjadi, debugger menulis pesan pengecualian ke jendela Output. Ini dapat menghentikan eksekusi dalam kasus berikut ketika:

  • Pengecualian muncul saat eksekusi tidak ditangani.
  • Debugger dikonfigurasikan untuk menghentikan eksekusi sebelum penanganan apa pun dipanggil.
  • Anda telah mengatur Just My Code, dan debugger dikonfigurasi untuk menghentikan pengecualian apa pun yang tidak ditangani dalam kode pengguna.

Catatan

ASP.NET memiliki penanganan pengecualian tingkat atas yang menampilkan halaman kesalahan di browser. Itu tidak menghentikan eksekusi kecuali Just My Code diaktifkan. Misalnya, lihat Memberi tahu debugger untuk melanjutkan pengecualian yang tidak ditangani pengguna di bawah ini.

Catatan

Dalam aplikasi Visual Basic, debugger mengelola semua kesalahan sebagai pengecualian, bahkan jika Anda menggunakan penanganan kesalahan gaya Kesalahan.

Memberi tahu debugger untuk berhenti saat pengecualian muncul

Debugger dapat menghentikan eksekusi pada titik di mana pengecualian muncul, jadi Anda dapat memeriksa pengecualian sebelum penanganan dipanggil.

Di jendela Pengaturan Pengecualian (Debug > Windows > Pengaturan Pengecualian), luaskan node untuk kategori pengecualian, seperti Pengecualian Runtime Bahasa Umum. Lalu pilih kotak centang untuk pengecualian tertentu dalam kategori tersebut, seperti System.AccessViolationException. Anda juga dapat memilih seluruh kategori pengecualian.

Screenshot of Exception Settings check box.

Screenshot of Exception Settings check box.

Tip

Anda dapat menemukan pengecualian tertentu menggunakan jendela Pencarian di toolbar Pengaturan Pengecualian, atau menggunakan pencarian untuk memfilter namespace layanan tertentu (seperti System.IO).

Jika Anda memilih pengecualian di jendela Pengaturan Pengecualian, eksekusi debugger akan berhenti di mana pun pengecualian muncul, tidak peduli apakah itu ditangani. Kini pengecualian disebut pengecualian kesempatan pertama. Misalnya, berikut adalah beberapa skenario:

  • Dalam aplikasi konsol C# berikut, metode Main memunculkan AccessViolationException ke dalam blok try/catch.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    Jika Anda memiliki AccessViolationException yang dicentang di Pengaturan Pengecualian, eksekusi akan berhenti pada baris throw saat Anda menjalankan kode ini di debugger. Anda kemudian dapat melanjutkan eksekusi. Konsol harus menampilkan kedua baris:

    caught exception
    goodbye
    

    tetapi tidak menampilkan baris here.

  • Aplikasi konsol C# mereferensikan pustaka kelas dengan kelas yang memiliki dua metode. Satu metode memunculkan pengecualian dan menanganinya, sementara metode kedua memunculkan pengecualian yang sama tetapi tidak menanganinya.

    public class Class1
    {
        public void ThrowHandledException()
        {
            try
            {
                throw new AccessViolationException();
            }
            catch (AccessViolationException ave)
            {
                Console.WriteLine("caught exception" + ave.Message);
            }
        }
    
        public void ThrowUnhandledException()
        {
            throw new AccessViolationException();
        }
    }
    

    Berikut adalah metode Main() dari aplikasi konsol:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    Jika Anda memiliki AccessViolationException yang dicentang di Pengaturan Pengecualian, eksekusi akan berhenti pada baris throw di ThrowHandledException() dan ThrowUnhandledException() ketika Anda menjalankan kode ini di debugger.

Untuk memulihkan pengaturan pengecualian ke default, pilih tombol Pulihkan daftar ke pengaturan default:

Screenshot of Restore Defaults in Exception Settings.

Screenshot of Restore Defaults in Exception Settings.

Memberi tahu debugger untuk melanjutkan pengecualian yang tidak ditangani pengguna

Jika Anda men-debug kode .NET atau JavaScript dengan Just My Code, Anda dapat memberi tahu debugger agar tidak berhenti pada pengecualian yang tidak ditangani dalam kode pengguna tetapi ditangani di tempat lain.

  1. Di jendela Pengaturan Pengecualian, buka menu pintasan dengan mengeklik kanan label kolom, lalu pilih Tampilkan Kolom > Tindakan Tambahan. (Jika Anda telah menonaktifkan Just My Code, Anda tidak akan melihat perintah ini.) Kolom ketiga bernama Tindakan Tambahan muncul.

    Screenshot of Additional Actions column.

    Screenshot of Additional Actions column.

    Untuk pengecualian yang menampilkan Lanjutkan saat tidak ditangani dalam kode pengguna di kolom ini, debugger akan berlanjut jika pengecualian tersebut tidak ditangani dalam kode pengguna tetapi ditangani secara eksternal.

  2. Untuk mengubah pengaturan ini untuk pengecualian tertentu, pilih pengecualian, klik kanan untuk menampilkan menu pintasan, dan pilih Lanjutkan Saat Tidak Ditangani di Kode Pengguna. Anda juga dapat mengubah pengaturan untuk seluruh kategori pengecualian, seperti seluruh pengecualian Runtime Bahasa Umum).

    Screenshot of Continue when unhandled in user code setting.

    Screenshot of Continue when unhandled in user code setting.

Misalnya, aplikasi web ASP.NET menangani pengecualian dengan mengonversinya menjadi kode status HTTP 500 (Penanganan pengecualian di ASP.NET Web API), yang mungkin tidak membantu Anda menentukan sumber pengecualian. Pada contoh di bawah, kode pengguna melakukan panggilan ke String.Format() yang memunculkan FormatException. Eksekusi berhenti sebagai berikut:

Breaks on user-unhandled exception

Menambahkan dan menghapus pengecualian

Anda dapat menambahkan dan menghapus pengecualian. Untuk menghapus jenis pengecualian dari kategori, pilih pengecualian, dan pilih tombol Hapus pengecualian yang dipilih dari daftar (tanda minus) pada toolbar Pengaturan Pengecualian. Atau Anda dapat mengeklik kanan pengecualian dan memilih Hapus dari menu pintasan. Menghapus eksepsi memiliki efek yang sama dengan membiarkan eksepsi tidak dicentang, yaitu debugger tidak akan berhenti saat muncul.

Untuk menambahkan pengecualian:

  1. Di jendela Pengaturan Pengecualian, pilih salah satu kategori pengecualian (misalnya, Runtime Bahasa Umum).

  2. Pilih tombol Tambahkan pengecualian ke kategori yang dipilih (tanda plus).

    Screenshot of Add an exception to the selected category button.

    Screenshot of Add an exception to the selected category button.

  3. Ketik nama pengecualian (misalnya, System.UriTemplateMatchException).

    Screenshot of Type exception name.

    Screenshot of Type exception name.

    Pengecualian ditambahkan ke daftar (dalam urutan alfabet) dan diperiksa secara otomatis.

Untuk menambahkan pengecualian ke Pengecualian Akses Memori GPU, Pengecualian Runtime JavaScript, atau kategori Pengecualian Win32, sertakan kode galat dan deskripsi.

Tip

Periksa ejaan Anda! Jendela Pengaturan Pengecualian tidak memeriksa keberadaan pengecualian tambahan. Jadi, jika Anda mengetik System.UriTemplateMatchException, Anda akan mendapatkan entri untuk pengecualian tersebut (dan bukan untuk System.UriTemplateMatchException).

Pengaturan pengecualian tetap ada dalam file .suo solusi, sehingga berlaku untuk solusi tertentu. Anda tidak dapat menggunakan kembali pengaturan pengecualian tertentu di seluruh solusi. Sekarang hanya pengecualian tambahan yang dipertahankan; pengecualian yang dihapus tidak. Anda dapat menambahkan pengecualian, menutup dan membuka kembali solusi, dan pengecualian akan tetap ada. Tetapi jika Anda menghapus pengecualian dan menutup/membuka kembali solusi, pengecualian akan muncul kembali.

Jendela Pengaturan Pengecualian mendukung jenis pengecualian generik dalam C# tetapi tidak dalam Visual Basic. Untuk menghentikan pengecualian seperti MyNamespace.GenericException<T>, Anda harus menambahkan pengecualian sebagai MyNamespace.GenericException`1. Artinya, jika Anda telah membuat pengecualian seperti kode ini:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

Anda dapat menambahkan pengecualian ke Pengaturan Pengecualian menggunakan prosedur sebelumnya:

Screenshot of Add generic exception.

Screenshot of Add generic exception.

Menambahkan kondisi ke pengecualian

Gunakan jendela Pengaturan Pengecualian untuk menetapkan kondisi pada pengecualian. Kondisi yang didukung saat ini mencakup nama modul yang akan disertakan atau dikecualikan untuk pengecualian. Dengan mengatur nama modul sebagai kondisi, Anda dapat memilih untuk memutuskan pengecualian hanya pada modul kode tertentu. Anda juga dapat memilih untuk menghindari kerusakan pada modul tertentu.

Catatan

Menambahkan kondisi ke pengecualian didukung mulai di Visual Studio 2017.

Untuk menambahkan pengecualian kondisional:

  1. Pilih tombol Edit kondisi di jendela Pengaturan Pengecualian, atau klik kanan pengecualian dan pilih Edit Kondisi.

    Screenshot of exception conditions.

  2. Untuk menambahkan kondisi tambahan yang diperlukan ke pengecualian, pilih Tambahkan Kondisi untuk setiap kondisi baru. Baris kondisi tambahan muncul.

    Screenshot of extra conditions for an exception.

  3. Untuk setiap baris kondisi, ketik nama modul, dan ubah daftar operator perbandingan menjadi Sama dengan atau Tidak Sama dengan. Anda dapat menentukan wildcard (\*) dalam nama untuk menentukan lebih dari satu modul.

  4. Jika Anda perlu menghapus kondisi, pilih X di akhir baris kondisi.