Add-in ArcGIS 10: Penanganan pengecualian tingkat atas

10

Add-in ArcGIS 10 yang saya kerjakan cukup sederhana - hanya alat kontrol dan jendela dockable. Saya menangani pengecualian spesifik yang saya perkirakan terjadi pada sumbernya dan membuang yang lainnya, tetapi apa praktik terbaik untuk menangani pengecualian yang tidak terduga itu dalam kerangka kerja tambahan?

Saat ini saya hanya melakukan catch (System.Exception ex)dan menunjukkannya di MessageBox di setiap metode yang tidak memiliki metode tingkat tinggi yang bisa saya tangani, tapi ini sepertinya bukan praktik terbaik (dan tentu saja, FxCop merengek tentang itu).

Apakah ada fasilitas dalam kerangka tambahan ArcGIS 10 untuk penangan pengecualian tingkat atas yang akan dihubungkan, misalnya ke Application.ThreadExceptionatau AppDomain.UnhandledExceptionacara?

Melihat add-in hanyalah pustaka kelas dan bukan aplikasi tanpa akses ke kode startup aplikasi yang mendasarinya (dari apa yang saya kumpulkan, acara-acara itu harus dihubungkan sangat awal dalam proses startup), dugaan saya tidak, tapi saya pikir Saya akan bertanya apakah ada pakar di luar sana yang memiliki saran tentang bagaimana pengecualian "tak terduga" harus ditangani dalam tambahan.

blah238
sumber
1
Hanya FYI: di sini ada tautan yang mencoba memperbaikinya sedikit di esri
Erik L
@ blah238 Apa yang telah Anda lakukan untuk menyelesaikan masalah Anda? Bisakah Anda memberi saya beberapa petunjuk untuk menangani pengecualian yang tidak ditangani?
Emi
Letakkan penangan pengecualian di setiap titik masuk ke kode Anda.
blah238
Di setiap titik masuk? !! Tidak ada cara lain untuk menanganinya dari tingkat atas?
Emi
Itu pemahaman saya, ya. Lihat tautan @baens di atas jika Anda ingin melihat ini ditingkatkan.
blah238

Jawaban:

7

Sejauh yang saya tahu, Anda menerapkan penanganan kesalahan yang saat ini dilakukan ESRI sebagai praktik terbaik. Jika Anda ingin memegang pengecualian ( ArcMap ) aplikasi yang tidak ditangani, Anda mungkin berpotensi menampilkan pesan tentang kesalahan yang bukan bagian dari AddIn Anda. Sebagian besar AddIns yang Anda tulis mungkin adalah tombol dan yang benar-benar hanya memiliki dua rute utama yang akan menangkap dan menampilkan kesalahan yang tidak terduga ( onClick dan onUpdate ).

Ingatlah untuk menggunakan ' throw ' daripada ' throw ex '. Ada perbedaan satu menit, tetapi hasilnya mempertahankan garis silsilah kesalahan karena muncul dari fungsi yang dipanggil.

Troy Schmidt
sumber
Terima kasih, inilah yang saya harapkan sebagai kasus karena semua sampel ESRI melakukannya dengan cara yang sama.
blah238
@Troy Schmidt bisa tolong beri saya petunjuk tentang ketika saya menggunakan jendela dockable, bagaimana saya bisa menangani pengecualian tidak tertangani? Dan dari mana dan apa yang harus saya "Lempar"?
Emi
2

Saya bekerja dengan add-in ArcGIS. Add-in saya terdiri dari jendela yang dapat di-dock dan kontrol alat. Saya mencoba menyimpan log kerusakan ArcGIS karena alat saya. Dan saya mendapatkan beberapa keberhasilan dalam penanganan pengecualian tingkat atas menggunakan Application.ThreadException. Karena pengecualian utas hanya berfungsi untuk utas UI, setelah instantiating jendela dockable, pengecualian apa pun yang dapat menyebabkan crash ArcGIS, ia menangkap itu, tetapi tidak berfungsi sebelum instantiasi jendela dockable.

    public class AddinImpl : ESRI.ArcGIS.Desktop.AddIns.DockableWindow
    {
        private WatershedDelineationDockableWindow m_windowUI;

        public WatershedDelineationDockableWindow GetUI
        {
            get
            {
                return m_windowUI;
            }
        }

        public AddinImpl()
        {
            Application.ThreadException += MYThreadHandler;
            Log.Info("Creating dockable window.");
        }

        static void MYThreadHandler(object sender, ThreadExceptionEventArgs e)
        {
            Log.Error("unhandled error in thread " + e.Exception.ToString());
            MessageBox.Show("unhandled error in thread " + e.Exception.ToString());
        }

        protected override IntPtr OnCreateChild()
        {
            m_windowUI = new WatershedDelineationDockableWindow(this.Hook);
            return m_windowUI.Handle;
        }

        protected override void Dispose(bool disposing)
        {
            if (m_windowUI != null)
                m_windowUI.Dispose(disposing);

            base.Dispose(disposing);
            Log.Info("Closing dockable window ");
        }
    }

Ini melakukan penanganan pengecualian tingkat atas setelah membuat instance UI

Emi
sumber
Menarik, terima kasih telah memposting temuan Anda. Saya harus bermain-main dengan ini. Secara khusus, saya bertanya-tanya apakah jendela dockable benar-benar diperlukan atau apakah itu dapat diatur dalam ekstensi.
blah238
@ blah238 Thread.Exception juga berfungsi ketika saya menaruhnya di metode onclick tombol. Saya pikir ini berfungsi untuk kontrol apa pun yang berinteraksi dengan UI.
Emi