Visual Studio 2015 istirahat pada pengecualian tidak tertangani tidak berfungsi

114

Visual studio dulu memiliki kotak centang khusus untuk "Break on Un-handling exception". Pada tahun 2015 ini telah dihapus (atau dipindahkan ke suatu tempat yang tidak dapat saya temukan). Jadi sekarang proyek saya yang dikonversi tidak lagi rusak jika saya gagal memberikan pengendali pengecualian tingkat pengguna. Saya tidak ingin melanggar semua "pengecualian yang terlempar" karena saya menangani yang spesifik. Di mana saya gagal memberikan penangan khusus.

Saat ini kode saya hanya keluar dari prosedur saat ini dan melanjutkan eksekusi di lokasi tumpukan panggilan berikutnya, TIDAK BAIK.

Ada yang tahu cara mendapatkan ini kembali di Visual Studio 2015? Saya baru saja meningkatkan ke edisi komunitas kemarin.

Ted Lowery
sumber
Visual Studio 2015 akan menyimpan tata letak saat ini dari versi sebelumnya, jika tab Toolatau Windowtidak memiliki semua lokasi yang diinginkan. Dalam kasus Anda, Anda mencari Pengaturan Pengecualian .
Greg
4
@greg, bukan karena saya tidak tahu di mana menemukan panel. Perhatian saya adalah perilaku yang saya cari tidak ada di panel itu.
Ted Lowery
Masalah yang sama disini. Dalam kasus kami, kami mengharapkan jeda pengecualian ketika autofac tidak memiliki semua jenis yang terdaftar. Menggunakan solusi yang sama dengan vs2013 berfungsi, di vs2015 kami tidak mendapatkan apa-apa. ini juga merupakan masalah dengan pendaftaran dan pengecualian pihak ketiga lainnya (seperti nservicebus). Saya ingin tahu apakah ini hanya kasus untuk proyek yang dibuat di vs2013 dan berjalan di vs2015
Choco Smith
3
Jendela alat baru itu benar-benar payah.
cedd
Menurut Klasifikasi Pengecualian MS jika Anda memiliki pengecualian yang tidak tertangani, itu selalu merusak debugger. Mungkin Anda harus mencentang opsi "Istirahat ketika pengecualian melintasi AppDomain ..." dalam daftar "Opsi -> Debugging -> Umum".
tsul

Jawaban:

118

Ada jendela baru bernama "Pengaturan Pengecualian" yang muncul di panel kanan bawah secara default saat Anda mulai men-debug. Ia memiliki semua opsi yang Anda harapkan.

Anda dapat memunculkannya dengan CTRL+ ALT+E

Hal ini memungkinkan Anda untuk memilih pengecualian mana yang menyebabkan jeda dalam debugger.

Namun, kuncinya adalah Anda juga dapat menyetel apakah pengecualian ini selalu rusak, atau hanya rusak jika pengecualian tidak tertangani - tetapi menyetel ini tidak terlalu intuitif.

Anda harus terlebih dahulu memeriksa "Aktifkan Hanya Kode Saya" di bawah Alat> Opsi> Debugging.

Ini kemudian memungkinkan Anda untuk mengklik kanan tajuk kolom (Hentikan Saat Dilempar) di jendela Pengaturan Pengecualian baru, dan menambahkan kolom "Tindakan Tambahan", yang kemudian memungkinkan Anda untuk mengatur setiap pengecualian sebagai "Lanjutkan saat tidak ditangani dalam kode pengguna".

Jadi, cukup klik kanan pengecualian atau seluruh grup dan nonaktifkan tanda "Lanjutkan saat tidak ditangani dalam kode pengguna". Sayangnya, kolom "Tindakan Tambahan" akan muncul kosong yang sama dengan "Hentikan saat tidak ditangani dalam kode pengguna".

masukkan deskripsi gambar di sini

Lebih lanjut tentang ini di sini:

http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Tom Studee
sumber
7
Sebenarnya jendela itu hanya memiliki opsi untuk "break with thrown". Bukan itu yang saya inginkan. Saya ingin "istirahat saat tidak tertangani".
Ted Lowery
17
dan itulah masalahnya. Itu TIDAK rusak. seperti yang saya katakan di atas, itu keluar (keluar) dari panggilan prosedur saat ini dan hanya mulai menjalankan baris kode berikutnya dalam prosedur panggilan.
Ted Lowery
2
dan AKU telah mengaktifkan "Just My Code".
Ted Lowery
19
@TomStudee Saya memiliki masalah yang sama juga. Yang saya inginkan adalah "Istirahat saat tidak tertangani" tetapi yang saya dapat adalah "Istirahat saat dilempar". Pertanyaannya adalah: bagaimana cara mendapatkan "Istirahat saat tidak tertangani"?
ogggre
1
@TomStudee Saya baru saja menambahkan beberapa klarifikasi yang sangat dibutuhkan, karena Anda kehilangan pengaturan kunci yang memungkinkan Anda mengatur pengecualian untuk hanya rusak saat tidak ditangani.
Jerad Rose
36

Saya memiliki masalah yang sama dan saya berhasil menyelesaikannya dengan melakukan ini -

  1. Tekan Ctrl+ Alt+ euntuk membuka jendela Pengaturan Pengecualian .
  2. Centang Pengecualian Waktu Proses Bahasa Umum . masukkan deskripsi gambar di sini

Itu dia!

Saya terinspirasi posting ini karena saya menggunakan Windows versi x64 .

Justin XL
sumber
7
Itu akan menyebabkannya merusak semua pengecualian, bahkan yang ditangani oleh kode pengguna.
carlin.scott
1
@ carlin.scott, saya yakin Anda dapat secara manual menghapus centang pengecualian yang ditangani dari daftar.
Justin XL
6
@JustinXL Masalahnya adalah, ini adalah daftar berdasarkan jenis pengecualian, bukan apakah ditangani atau tidak. Misalnya, ada kalanya System.ArgumentExceptionditangani, dan ada saatnya tidak. Saya hanya peduli tentang kerusakan jika tidak ditangani.
Jerad Rose
1
@JeradRose Debugger akan selalu rusak saat pengecualian tidak ditangani. Jadi seperti yang saya katakan, jika Anda tidak ingin menghentikan pengecualian yang ditangani, cukup hapus centang jenis pengecualian itu dari daftar Break When Thrown .
Justin XL
Bahkan ketika memeriksa semuanya itu tidak melanggar pengecualian: / baru saja keluar
Douglas Gaskell
10

Untuk googler yang ingin merusak hanya ketika pengecualian menyangkut kode mereka, ada opsi di Visual Studio 2015: Options-> Debugging-> General-> Just My Code. Setelah dicentang, itu memungkinkan untuk tidak rusak ketika pengecualian dikelola (dilempar dan ditangkap) di luar kode Anda.

Olivier de Rivoyre
sumber
Ini menyelamatkan saya untuk situasi lain di mana VS2015 karena alasan tertentu menolak untuk memasukkan beberapa kode. Kode tersebut adalah "milik saya" tetapi sesuatu memicu tanda "Hanya kode saya". Saya kira ada bug di suatu tempat ketika menjalankan 2 contoh VS dan server web yang berdiri sendiri dan mungkin beberapa lagi.
LosManos
9

Microsoft telah mengubah logika secara halus di jendela pengecualian baru.

Lihat http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

Bagian kuncinya adalah:

Catatan penting

  • Jendela baru ini berisi semua fungsionalitas yang sama seperti dialog modal lama. Tidak ada kemampuan debugger yang hanya mengubah cara Anda mengaksesnya
  • Debugger akan selalu rusak saat pengecualian tidak ditangani
  • Pengaturan untuk berubah jika debugger rusak pada pengecualian yang tidak ditangani pengguna telah dipindahkan di bawah menu konteks
  • Lokasi menu telah dipindahkan ke Debug -> Windows -> Pengaturan Pengecualian

Namun , jika seperti saya, Anda memiliki Global Unhandled Exception Handler dalam kode Anda, maka item kedua dalam daftar itu adalah kuncinya: Bagi saya, tidak ada pengecualian yang akan benar-benar tidak tertangani, yang tampaknya berbeda dari VS2013.

Untuk mengembalikan perilaku di mana VS terputus pada pengecualian yang tidak tertangani, saya harus mencentang semua jenis pengecualian yang ingin saya hilangkan dan kemudian kedua memastikan bahwa "Opsi Tambahan" (Anda mungkin perlu membuat kolom ini terlihat *) untuk "Lanjutkan ketika tidak ditangani dalam kode pengguna " TIDAK disetel. Logika VS2015 tampaknya tidak menganggap Global Unhandled Exception Handler saya sebagai "ditangani dalam kode pengguna", jadi ia tidak merusak ini; itu tidak merusak pengecualian yang tertangkap. Ini membuatnya berfungsi seperti yang dilakukan VS2013.

* Cara mengaktifkan kolom "Tindakan Tambahan" * Cara mengaktifkan kolom "Tindakan Tambahan"

oatsoda
sumber
2
Ini tidak berfungsi persis seperti VS2013 karena akan merusak pengecualian yang ditangani pengguna dengan pengaturan yang Anda sarankan, yang sebelumnya tidak terjadi.
carlin.scott
Bagaimana Anda membuat kolom "Opsi Tambahan" terlihat?
UuDdLrLrSs
@DaveInCaz kanan klik pada judul kolom> "Tampilkan Kolom"> "Tindakan tambahan"
oatsoda
7

Jika saya membaca dengan benar yang tersirat di sini, masalahnya adalah bahwa pengecualian Anda secara efektif 'menghilang' meskipun perilaku debugger default seharusnya rusak pada pengecualian yang tidak tertangani.

Jika Anda memiliki metode asynchronous, Anda mungkin mengalami masalah ini karena pengecualian tidak tertangkap di thread pool thread sebagai bagian dari kelanjutan tugas tidak dianggap pengecualian tidak tertangani. Sebaliknya, mereka ditelan dan disimpan dengan Tugas.

Misalnya, lihat kode ini:

class Program
{
    static void Main(string[] args)
    {
        Test();
        Console.ReadLine();
    }

    private async static Task Test()
    {
        await Task.Delay(100);
        throw new Exception("Exception!");
    }
}

Jika Anda menjalankan program ini dengan setelan debugger default (berhenti hanya pada pengecualian yang tidak tertangani), debugger tidak akan rusak. Ini karena utas kumpulan utas yang dialokasikan untuk kelanjutan menelan pengecualian (meneruskannya ke contoh Tugas) dan melepaskan dirinya kembali ke kumpulan.

Perhatikan bahwa, dalam hal ini, masalah sebenarnya adalah bahwa Taskdikembalikan olehTest() tidak pernah diperiksa. Jika Anda memiliki jenis logika 'api-dan-lupakan' yang serupa dalam kode Anda, maka Anda tidak akan melihat pengecualian pada saat pengecualian tersebut dilempar (bahkan jika 'tidak ditangani' di dalam metode); pengecualian hanya muncul saat Anda mengamati Tugas dengan menunggunya, memeriksa Hasil atau secara eksplisit melihat Pengecualiannya.

Ini hanya tebakan, tapi menurut saya kemungkinan besar Anda mengamati sesuatu seperti ini.

Dan Bryant
sumber
Meskipun ini mungkin tidak terkait dengan masalah operasi, ada hal yang sangat bagus tentang pengecualian yang diangkat dalam rutinitas asinkron.
Phil Cooper
Apakah ada cara untuk menghentikan debugger meskipun pengecualian disimpan seperti itu?
Lucas
@Lucas, Saya tidak menyadarinya, meskipun Anda dapat mendekati dengan beberapa perubahan kode. Jika tubuh metode api-dan-lupakan Anda memiliki blok coba-tangkap, Anda dapat menambahkan Debugger.Break()panggilan eksplisit . Bergantian, Anda dapat menambahkan eksplisit Debugger.Break()di TaskScheduler.UnobservedTaskExceptionhandler, meskipun sisi negatifnya di sini adalah bahwa ini dapat diaktifkan lebih lama dari pengecualian asli, seperti yang terjadi pada utas finalizer ketika Tugas dibersihkan. Secara umum, Anda harus berusaha untuk selalu mengamati hasil Tugas atau setidaknya memiliki blok coba-tangkap untuk dicatat pada saat kegagalan.
Dan Bryant
3

Dalam pengalaman saya, pengaturan pengecualian pada tahun 2015 akan benar-benar rusak jika Anda mengubah apa pun.

Berharap bahwa jika Anda sampai grup induk "CLR" maka Anda tidak akan mendapatkan execpt melanggar untuk ditangani. Anda akan selalu rusak jika pengecualian tidak tertangani. Tetapi, jika Anda memiliki grup CLR yang tidak dicentang, kode di dalam try ... catch seharusnya tidak menyebabkan jeda. Bukan itu masalahnya.

Solusi: Di ​​kotak alat pengaturan pengecualian baru, klik kanan dan pilih "pulihkan default". Taadaaaa ... Ini berperilaku normal lagi. Sekarang jangan mengacaukannya.

Clint StLaurent
sumber
1

Coba ikuti instruksinya:

  1. Di jendela Pengaturan Pengecualian, buka menu konteks dengan mengklik kanan di jendela dan kemudian memilih Tampilkan Kolom. (Jika Anda telah mematikan Just My Code, Anda tidak akan melihat perintah ini.)
  2. Anda akan melihat kolom kedua bernama Tindakan Tambahan. Kolom ini menampilkan Lanjutkan saat tidak ditangani oleh kode pengguna pada pengecualian tertentu, yang berarti bahwa debugger tidak rusak jika pengecualian itu tidak ditangani dalam kode pengguna tetapi ditangani dalam kode eksternal.
  3. Anda dapat mengubah pengaturan ini baik untuk pengecualian tertentu (pilih pengecualian, klik kanan, dan pilih / batal pilih Lanjutkan saat Tidak Ditangani dalam Kode Pengguna) atau untuk seluruh kategori pengecualian (misalnya, semua pengecualian Waktu Proses Bahasa Umum).

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx

Andrei
sumber
Sangat setuju. Sangat buruk untuk tidak menampilkan kolom ini secara default. Menghabiskan banyak waktu untuk menemukannya. Selain itu, apa yang dimaksud dengan " pengecualian tidak tertangani pengguna " agak tidak jelas. Saya memiliki penangan pembatalan Tugas saya (sesuatu seperti try { task.Wait(); } catch { ... }) dan OperationCanceledException dalam tugas tersebut dianggap tidak tertangani dalam kode pengguna.
tsul
1

Itu semua agak membingungkan, dan menurut saya tidak sebagus dialog pengecualian lama, tapi bagaimanapun juga.

Jika pengecualian ada dalam daftar dan dicentang maka debugger akan berhenti setiap kali pengecualian dilemparkan.

Jika pengecualian tidak dicentang atau tidak ada dalam daftar maka debugger hanya akan rusak ketika jenis pengecualian itu tidak ditangani oleh pengguna.

Misalnya, pada tangkapan layar di bawah ini, debugger akan rusak setiap kali a System.AccessViolationExceptiondilempar, tetapi untuk semua pengecualian lainnya itu hanya akan rusak jika pengecualian itu tidak ditangani oleh pengguna.

Jendela alat pengecualian Visual studio 2015

cedd
sumber
1

Ketika saya meningkatkan ke VS2015, saya juga mengalami masalah di mana pengecualian digunakan untuk "merusak" aplikasi, tetapi sekarang diabaikan dan dilewatkan begitu saja. Ada kalanya kita ingin kode kita sengaja membuang pengecualian di tempat kita ingin kode berhenti, daripada melanjutkan. Kami selalu menggunakan frasa Throw New Exception("Message")untuk membuat kode kami sengaja dipecah:

    If SomethingReallyBad = True Then
        Throw New Exception("Something Really Bad happened and we cannot continue.")
    End If

Dengan VS2015, "System.Exception" klasik adalah apa yang terlontar saat kita mengatakannya Throw New Exception . Oleh karena itu, kami perlu memeriksa centang "System.Exception" di Pengaturan Pengecualian baru:

Centang Kotak System.Exception

Setelah diperiksa, kode kami berfungsi seperti yang diharapkan.

J. Wyckoff
sumber
1

Solusinya adalah ini secara semantik berlawanan dengan apa yang Anda pikir Anda tetapkan. Anda perlu memastikan bahwa Lanjutkan ketika tertangani dalam kode pengguna yang tidak diaktifkan yaitu tidak diperiksa seperti yang ditunjukkan di bawah Tindakan Tambahan kolom di Exception pengaturan tab - lihat di bawah:

Anda secara efektif mengatakan jangan lanjutkan (yaitu putus) saat tidak ditangani dalam kode

Jendela Pengaturan Pengecualian (Control + Alt + E)

Untuk melakukan ini:

  1. Klik kanan pengecualian atau kumpulan pengecualian yang Anda pedulikan (biasanya baris teratas 'Pengecualian Waktu Proses Bahasa Umum' di pohon)
  2. Pilih opsi Lanjutkan Saat Tidak Ditangani dalam Kode Pengguna (lihat di bawah)
  3. Pastikan bahwa pengecualian tidak dicentang (lihat di bawah)
  4. lanjutkan debugging

masukkan deskripsi gambar di sini

Itu berhasil untuk saya - bahagia lagi.

Ini terjadi di VS 2015

Simon Sanderson
sumber
0

Pasti ada beberapa bug dalam Visual Studio yang dapat menyebabkannya macet sehingga memerlukan restart. Bahkan VS2015.

Saya memiliki satu situasi berulir di mana file NullReferenceException ditangkap oleh penangan 'luar' (masih dalam kode saya) meskipun saya memintanya untuk istirahat ketika dinaikkan.

Saya menyadari ini adalah pengecualian 'ditangani' dan Anda berbicara tentang 'tidak tertangani' - namun saya cukup yakin bahwa kadang-kadang restart cepat VS akan memperbaiki ini, jika IISRESET tidak.

Simon_Weaver
sumber
0

Visual Studio 2017 berfungsi dengan baik dengan penanganan kesalahan. Visual Studio 2015 di sisi lain menyebalkan penanganan kesalahan dengan tugas karena dalam mode debug semua pengecualian yang terjadi dalam tugas async ditangkap tetapi kemudian jika saya melangkahi itu hanya hang tanpa batas. Jika dijalankan tanpa debugging, ia akan hang tanpa batas tanpa terkecuali tertangkap !!! Saya suka studio visual dan telah menggunakannya sejak 1995 dan 2015 adalah versi yang lebih buruk sejauh ini meskipun saya melompat dari 2010 langsung ke 2015. Saya menghabiskan 8 jam mencoba untuk mendapatkan penanganan pengecualian ini bekerja tanpa hasil. Saya menyalin kode persisnya ke 2017 di komputer rumah saya dan berfungsi dengan sempurna. Saya sangat kesal karena Microsoft mendorong tugas ke dalam kerangka kerja yang tidak dapat ditangani oleh kompiler 2015 dengan benar.

Musa
sumber