Saya menggunakan objek COM (MODI) dari dalam aplikasi .net saya. Metode yang saya panggil melempar System.AccessViolationException, yang dicegat oleh Visual Studio. Yang aneh adalah bahwa saya telah membungkus panggilan saya dalam try catch, yang memiliki penangan untuk AccessViolationException, COMException dan yang lainnya, tetapi ketika Visual Studio (2010) mencegat AccessViolationException, debugger istirahat pada pemanggilan metode (doc.OCR), dan jika saya melangkah, itu berlanjut ke baris berikutnya alih-alih memasuki blok tangkap. Selain itu, jika saya menjalankan ini di luar studio visual aplikasi saya macet. Bagaimana saya bisa menangani pengecualian ini yang dilemparkan ke dalam objek COM?
MODI.Document doc = new MODI.Document();
try
{
doc.Create(sFileName);
try
{
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
sText = doc.Images[0].Layout.Text;
}
catch (System.AccessViolationException ex)
{
//MODI seems to get access violations for some reason, but is still able to return the OCR text.
sText = doc.Images[0].Layout.Text;
}
catch (System.Runtime.InteropServices.COMException ex)
{
//if no text exists, the engine throws an exception.
sText = "";
}
catch
{
sText = "";
}
if (sText != null)
{
sText = sText.Trim();
}
}
finally
{
doc.Close(false);
//Cleanup routine, this is how we are able to delete files used by MODI.
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
doc = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
Exception
penangan (sementara!) Untuk menjebak semua pengecualian dan melihat apa sebenarnya pengecualian itu?Jawaban:
Dalam .NET 4.0, runtime menangani pengecualian tertentu yang muncul sebagai kesalahan penanganan terstruktur Windows (SEH) sebagai indikator negara terkorupsi. Pengecualian negara terkorupsi (CSE) ini tidak diizinkan ditangkap oleh kode terkelola standar Anda. Saya tidak akan masuk ke mengapa atau bagaimana di sini. Baca artikel ini tentang CSE di .NET 4.0 Framework:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
Tapi ada harapan. Ada beberapa cara untuk mengatasi ini:
Kompilasi ulang sebagai perakitan .NET 3.5 dan jalankan dalam .NET 4.0.
Tambahkan baris ke file konfigurasi aplikasi Anda di bawah elemen konfigurasi / runtime:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
Hiasi metode yang Anda ingin tangkap pengecualian ini dengan
HandleProcessCorruptedStateExceptions
atribut. Lihat http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 untuk detailnya.EDIT
Sebelumnya, saya merujuk posting forum untuk rincian tambahan. Tetapi karena Microsoft Connect telah pensiun, berikut adalah detail tambahan jika Anda tertarik:
Dari Gaurav Khanna, seorang pengembang dari Tim CLR Microsoft
Dia kemudian melanjutkan untuk referensi dokumentasi pada HandleProcessCorruptedStateExceptionsAttribute dan artikel di atas. Cukuplah untuk mengatakan, itu layak dibaca jika Anda mempertimbangkan menangkap jenis pengecualian ini.
sumber
HandleProcessCorruptedStateExceptions
bekerja untuk saya di .Net 4.5.OR
" dari cara untuk melakukannya. :)Tambahkan berikut ini di file konfigurasi, dan itu akan ditangkap di blok coba tangkap. Kata hati-hati ... cobalah untuk menghindari situasi ini, karena ini berarti beberapa jenis pelanggaran sedang terjadi.
sumber
Disusun dari jawaban di atas, bekerja untuk saya, melakukan langkah-langkah berikut untuk menangkapnya.
Langkah # 1 - Tambahkan potongan berikut ke file konfigurasi
Langkah 2
Menambahkan -
di bagian atas fungsi Anda mengikat menangkap pengecualian
sumber: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
sumber
Microsoft: "Pengecualian keadaan proses terkorupsi adalah pengecualian yang menunjukkan bahwa keadaan suatu proses telah rusak. Kami tidak merekomendasikan untuk menjalankan aplikasi Anda dalam keadaan ini ..... Jika Anda benar - benar yakin bahwa Anda ingin mempertahankan penanganan ini pengecualian, Anda harus menerapkan
HandleProcessCorruptedStateExceptionsAttribute
atribut "Microsoft: "Gunakan domain aplikasi untuk mengisolasi tugas yang mungkin menurunkan proses."
Program di bawah ini akan melindungi aplikasi / utas utama Anda dari kegagalan yang tidak dapat dipulihkan tanpa risiko yang terkait dengan penggunaan
HandleProcessCorruptedStateExceptions
dan<legacyCorruptedStateExceptionsPolicy>
sumber
Anda dapat mencoba menggunakan AppDomain.UnhandledException dan melihat apakah itu memungkinkan Anda menangkapnya.
** EDIT *
Berikut ini beberapa informasi lain yang mungkin berguna (sudah lama dibaca).
sumber