Android Studio IDE: Break on Exception

138

Sepertinya Android Studio saya tidak ingin merusak pengecualian apa pun secara default. Mengaktifkan jeda pada "Pengecualian Apa Pun" mulai memecah dalam pustaka JDE yang sebenarnya. Apakah ada cara untuk memaksanya memecah hanya pada pengecualian dalam kode saya saja?

Datang dari Visual Studio universe, mencari perilaku debug standar VS di sini.

AlexVPerl
sumber

Jawaban:

206

Untuk membatalkan semua pengecualian, tertangkap atau tidak tertangkap:

  1. Buka jendela Breakpoints melalui Run -> View Breakpoints .
  2. Dialog Breakpoints muncul. Di panel kiri, gulir ke bawah. Pilih Setiap pengecualian di bawah Java Exception Breakpoints
  3. Dengan Setiap pengecualian dipilih, di panel kanan, konfigurasikan sebagai berikut:
    • Tangguhkan: dicentang
    • Semua: dipilih
    • Kondisi: !(this instanceof java.lang.ClassNotFoundException)
    • Pemberitahuan: baik Tertangkap pengecualian dan pengecualian Tertangkap dipilih

Dialog breakpoints

  1. Tetapkan filter yang menentukan ruang nama perpustakaan yang harus dihilangkan oleh debugger : Centang kotak filter Kelas untuk mengaktifkan filter kelas ( seperti yang disebutkan oleh @Scott Barta ). Kemudian klik tombol ... (elipsis) untuk membuka dialog Filter Kelas. Tentukan pola namespace kelas dengan mengklik tombol Tambahkan Pola(Tambah Pola). Memasukkan:
    • com.myapp.* (ganti ini dengan awalan namespace dari aplikasi Anda)
    • java.* (catatan: sesuai pertanyaan OP, biarkan ini untuk TIDAK merusak perpustakaan Java)
    • android.* (seperti di atas, tinggalkan hanya debug kode aplikasi sendiri)
    • Tambahkan ruang nama tambahan apa pun yang diperlukan (mis. Perpustakaan pihak ketiga)

Filter Kelas

  1. Tekan OK , lalu abaikan dialog Breakpoints.
CJBS
sumber
6
@AndroidDev Ini bukan antarmuka terbaik, terutama ketika datang dari menggunakan Visual Studio IDE. Filter kelas adalah untuk mencegah segala macam kesalahan tingkat rendah menghentikan aplikasi lebih sering (terutama selama inisialisasi aplikasi). Sebagai contoh, ikuti langkah-langkah di atas, tetapi tanpa filter kelas, lalu mulai aplikasi dalam mode debug dan lihat apa yang terjadi.
CJBS
6
@AndroidDev: Saya pikir itu masuk akal sebenarnya. Secara default itu tidak berlaku untuk semua pengecualian. Anda tidak perlu mengatur kondisi dan filter. Namun, OP memang meminta penyaringan pengecualian (pengecualian dalam kodenya sendiri).
Mooing Duck
4
Sebagai pengembang xcode / iOS dan android-n00b, saya tidak tahu bahwa agar ada breakpoint APAPUN, di studio Android Anda tidak dapat mengklik ikon play-like (triangle) untuk memulai aplikasi. Anda harus memulai aplikasi dengan mengklik ikon seperti bug di sebelahnya di sebelah kanan.
xaphod
@xaphod Cara lain adalah menjalankan dalam mode rilis (tekan tombol putar), kemudian setelah aplikasi telah dimulai, pasang debugger (dengan menekan perangkat dengan persegi panjang potret-bug dengan bug hijau di ikon kanan bawah), lalu pilih proses untuk didebug. Ini jauh lebih cepat jika tidak men-debug kode start-up aplikasi mana pun. Lihat: developer.android.com/tools/debugging/…
CJBS
Jika Anda menggunakan junit (debugging saat pengujian unit), Anda mungkin ingin menambahkan filter kelasorg.junit.*
Thomas Vincent
34

Jika Anda membuka jendela Breakpoints, itu memberi Anda beberapa opsi untuk membuatnya rusak atau tidak. Apa yang Anda cari adalah "filter Kelas" di sini - Anda dapat menentukan ekspresi wildcard dengan, misalnya, jalur paket Java, dan itu hanya akan terputus untuk pengecualian yang dihasilkan dari kelas yang cocok.

Scott Barta
sumber
4
Bagi siapa pun yang mencari jendela Breakpoints, dapat ditemukan di menu, Run -> View Breakpoints.
Patrick
2
Saya mencoba ini, tetapi tidak dapat membuatnya bekerja. Apa yang seharusnya menjadi filter kelas? Bisakah memberikan beberapa contoh?
Bart Friederichs
1
Saya berada di kapal yang sama - filter kelas sepertinya tidak berfungsi untuk saya. Saya sudah mencoba com.mycompany. * Tetapi tidak ada pengecualian yang menyebabkannya rusak.
Kylotan
Itu hanya berhenti di ZygoteInit.java setiap saat! Cukup tidak berguna! Bagaimana mengatasinya ???
Renaud Cerrato
Jalankan-> Lihat Breakpoints .... ya, kami tidak ingin jendela ditampilkan di bawah menu "View", kan!
LarryBud
7

Untuk menghapus semua pengecualian dalam kode Anda dan pengecualian lainnya jika tidak tertangkap:

Metode ini memfilter jenis pengecualian yang dilempar runtime selama operasi normal (tidak terlalu luar biasa, bukan?). Itu tidak menggunakan filter kelas, karena itu akan menyaring terlalu banyak; bug dalam kode Anda sering menyebabkan kelas runtime untuk melempar pengecualian (misalnya mengakses daftar array melewati akhir).

  1. Aktifkan Java Exception breakpoints / Setiap pengecualian untuk tidak tertangkap pengecualian saja.

  2. Tambahkan Java Exception BreakPoint baru untuk Exception (java.lang)kelas untuk pengecualian yang tertangkap dan tidak tertangkap . Aktifkan Kondisi dan atur ini:

        !(this instanceof java.lang.ClassNotFoundException || this instanceof android.system.ErrnoException || this instanceof java.io.FileNotFoundException || this instanceof javax.net.ssl.SSLHandshakeException || this instanceof javax.net.ssl.SSLPeerUnverifiedException || this instanceof android.system.GaiException || this instanceof java.net.SocketTimeoutException || this instanceof java.net.SocketException || this instanceof java.security.NoSuchAlgorithmException)
    

Tambahkan ke daftar pengecualian dalam kondisi pengecualian tidak biasa lainnya yang Anda temui. (BTW, menggunakan java.lang.Exceptionadalah cara untuk secara efektif mendapatkan entri "Pengecualian" kedua.)

Edward Brey
sumber
tidak lebih baik menggunakan! (a || b || c) daripada! (a) &&! (b) &&! (c)
ceph3us