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 akan dihentikan, dan pada titik mana Anda ingin debugger dihentikan (yaitu, jeda di debugger). Ketika debugger berhenti, debugger menunjukkan kepada Anda di mana pengecualian terjadi. Anda juga dapat menambahkan atau menghapus pengecualian. Dengan solusi terbuka di Visual Studio, gunakan Debug > Pengaturan Pengecualian Windows > untuk membuka jendela Pengaturan Pengecualian.

Berikan penangan yang merespons pengecualian terpenting. Jika Anda perlu tahu cara menambahkan handler 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.

Ketika pengecualian terjadi, debugger menulis pesan pengecualian ke jendela Output . Ini dapat memutus eksekusi dalam kasus-kasus berikut ketika:

  • Terjadi pengecualian yang tidak ditangani.
  • Debugger dikonfigurasi untuk memutus eksekusi sebelum handler dipanggil.
  • Anda telah mengatur Just My Code, dan debugger dikonfigurasi untuk menghentikan pengecualian apa pun yang tidak ditangani dalam kode pengguna.

Nota

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

Nota

Dalam aplikasi Visual Basic, debugger mengelola semua kesalahan sebagai pengecualian (exceptions), bahkan jika Anda menggunakan penangan kesalahan dengan gaya On Error.

Beri tahu debugger untuk berhenti saat pengecualian dilemparkan

Debugger dapat memutus eksekusi pada titik di mana pengecualian dilemparkan, sehingga Anda dapat memeriksa pengecualian sebelum handler dipanggil.

Di jendela Pengaturan Pengecualian (Debug > Windows > Pengaturan Pengecualian), perluas simpul untuk kategori pengecualian, seperti Common Language Runtime Pengecualian. Lalu pilih kotak centang untuk pengecualian tertentu dalam kategori tersebut, seperti System.AccessViolationException. Anda juga dapat memilih seluruh kategori pengecualian.

Cuplikan layar dialog Pengaturan Pengecualian.

Cuplikan layar kotak centang Pengaturan Pengecualian.

Petunjuk / Saran

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

Jika Anda memilih pengecualian di jendela Pengaturan Pengecualian, eksekusi debugger akan berhenti pada lokasi pengecualian dilemparkan, baik itu ditangani atau tidak. Sekarang pengecualian disebut pengecualian kesempatan pertama. Misalnya, berikut adalah beberapa skenario:

  • Dalam aplikasi konsol C# berikut, metode Utama melempar AccessViolationException 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 terputus pada throw baris saat Anda menjalankan kode ini di debugger. Anda kemudian dapat melanjutkan eksekusi. Konsol harus menampilkan kedua baris:

    caught exception
    goodbye
    

    baris here tidak ditampilkan.

  • Aplikasi konsol C# mereferensikan pustaka kelas dengan kelas yang memiliki dua metode. Satu metode melemparkan pengecualian dan menanganinya, sementara metode kedua melemparkan 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 diaktifkan di Pengaturan Pengecualian, pelaksanaan akan berhenti di baris throw pada keduanya ThrowHandledException() dan ThrowUnhandledException() saat Anda menjalankan kode ini di debugger.

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

Cuplikan layar tombol Pulihkan default di Pengaturan Pengecualian.

Cuplikan layar Pulihkan Pengaturan Awal di Pengaturan Pengecualian.

Beritahu debugger untuk melanjutkan pengecualian yang tidak tertangani oleh pengguna

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

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

    Cuplikan layar kolom Tindakan Tambahan.

    Untuk pengecualian yang menunjukkan Lanjutkan saat tidak ditangani dalam kode pengguna pada kolom ini, debugger akan berlanjut jika pengecualian tersebut tidak ditangani dalam kode pengguna, tetapi ditangani di luar.

  2. Untuk mengubah pengaturan ini untuk pengecualian tertentu, pilih pengecualian, klik kanan untuk menampilkan menu pintasan, dan pilih Lanjutkan Saat Tidak Tertangani dalam Kode Pengguna. Anda juga dapat mengubah setelan untuk kategori pengecualian, seperti pengecualian Common Language Runtime secara keseluruhan.

    Cuplikan layar dari pengaturan Lanjutkan Ketika Tidak Tertangani dalam Kode Pengguna.

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

Cuplikan layar yang memperlihatkan System.FormatException.

Berhenti pada pengecualian yang tidak ditangani oleh pengguna

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 mengklik kanan pengecualian dan memilih Hapus dari menu pintasan. Menghapus pengecualian memiliki efek yang sama seperti saat pengecualian tidak terdeteksi, yaitu debugger tidak akan berhenti ketika pengecualian itu dilemparkan.

Untuk menambahkan pengecualian:

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

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

    Cuplikan layar tombol Tambahkan pengecualian ke kategori yang dipilih.

    Cuplikan layar Tambahkan pengecualian ke tombol kategori yang dipilih.

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

    Cuplikan layar yang memperlihatkan nama pengecualian.

    Cuplikan layar Nama jenis pengecualian.

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

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

Petunjuk / Saran

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

Pengaturan pengecualian dipertahankan 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 umum di C# tetapi tidak di Visual Basic. Untuk memutuskan 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:

Cuplikan layar yang memperlihatkan cara menambahkan pengecualian generik.

Cuplikan layar Tambahkan pengecualian generik.

Menambahkan kondisi ke pengecualian

Gunakan jendela Pengaturan Pengecualian untuk mengatur kondisi pada pengecualian. Kondisi yang saat ini didukung termasuk nama modul untuk 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 pembobolan pada modul tertentu.

Nota

Menambahkan kondisi ke pengecualian didukung mulai dari Visual Studio 2017.

Untuk menambahkan pengecualian kondisional:

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

    Tangkapan layar kondisi pengecualian.

    Cuplikan layar kondisi pengecualian.

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

    Cuplikan layar yang memperlihatkan kondisi tambahan untuk pengecualian.

    Cuplikan layar kondisi tambahan untuk pengecualian.

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

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