ArcGIS 10 eklentisi: Üst düzey istisna işleme


10

Üzerinde çalıştığım ArcGIS 10 eklentisi oldukça basit - sadece bir araç kontrolü ve yerleştirilebilir pencere. Kaynakta gerçekleşmesini ve diğer her şeyi atmayı beklediğim özel istisnaları ele alıyorum, ancak eklenti çerçevesinde bu beklenmedik istisnaları ele almak için en iyi uygulama nedir?

Şu anda sadece bir yapıyorum catch (System.Exception ex)ve üstesinden gelemez bir üst düzey yöntemi olmayan her yöntemde bir MessageBox gösteren, ama bu en iyi uygulama gibi görünmüyor (ve tabii ki, FxCop sızlanan hakkında).

ArcGIS 10 eklenti çerçevesinde, örneğin Application.ThreadExceptionveya AppDomain.UnhandledExceptionolaylara bir üst düzey istisna işleyicisinin bağlanması için herhangi bir tesis var mı ?

Eklentiler olarak görmek sadece sınıf kütüphaneleridir ve temel uygulamanın başlangıç ​​koduna erişimi olmayan uygulamalar değildir (topladığımdan, bu olayların başlatma işlemine çok erken bağlanması gerekir), tahminim hayır, ama düşündüm Orada herhangi bir uzman eklentilerde "beklenmedik" istisnaların nasıl ele alınacağına dair herhangi bir öneri olup olmadığını sorardım.


1
Sadece FYI: İşte esri de bu biraz düzeltmek için bir bağlantı
Erik L

@ blah238 Sorununuzu çözmek için ne yaptınız? Lütfen ele alınmayan istisnaları ele almak için bana bazı göstergeler verebilir misiniz?
Emi

Kodunuzun her giriş noktasına bir özel durum işleyici koyun.
blah238

Her giriş noktasında? !! Üst düzeyden başa çıkmanın başka yolu yok mu?
Emi

Benim anlayışım bu, evet. Bunun iyileştiğini görmek istiyorsanız yukarıdaki @baens bağlantısına bakın.
blah238

Yanıtlar:


7

Söyleyebildiğim kadarıyla ESRI'nin şu anda en iyi uygulama olarak ortaya koyduğu hata işlemeyi uyguluyorsunuz. Uygulamanın ( ArcMap ) işlenmeyen istisnalarını bir kenara bırakırsanız, potansiyel olarak AddIn'inizin parçası olmayan hatalarla ilgili mesajlar gösterebilirsiniz. Yazdığınız AddIns'ların çoğu muhtemelen düğmeler olacak ve bunlar gerçekten beklenmedik hataların yakalanıp görüntüleneceği ( onClick ve onUpdate ) iki ana yola sahip .

Sadece 'kullanmayı unutmayın atışı ' yerine ' atış ex '. Bir dakika farkı vardır, ancak çağrılan işlevlerden köpürürken hatanın soyunun korunmasına neden olur.


Teşekkürler, tüm ESRI örnekleri aynı şekilde yaptığından böyle olmasını bekledim.
blah238

@Troy Schmidt, yerleştirilebilir bir pencere kullandığımda bana bir işaretçi verebilir misiniz, işlenmemiş istisnaları nasıl ele alabilirim? Ve nereden ve ne atmalıyım?
Emi

2

Bir ArcGIS eklentisiyle çalışıyorum. Eklentim yerleştirilebilir bir pencere ve bir araç kontrolünden oluşur. Aracım nedeniyle ArcGIS çökmesinin kaydını tutmaya çalışıyorum. Ve Application.ThreadException kullanarak üst düzey özel durum işleme bazı başarı elde. İş parçacığı istisnası yalnızca UI iş parçacığı için çalıştığından, yerleştirilebilir pencereyi somutlaştırdıktan sonra, ArcGIS'in çökmesine neden olabilecek herhangi bir istisna, bunu yakalar, ancak yerleştirilebilir pencereyi somutlaştırmadan önce çalışmaz.

    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 ");
        }
    }

Bu, kullanıcı arayüzünü başlattıktan sonra üst düzey istisna işlemeyi gerçekleştirir


İlginç, bulgularınızı gönderdiğiniz için teşekkürler. Bununla oynamak zorundayım. Özellikle, dockable penceresinin gerçekten gerekli olup olmadığını veya bir uzantıda kurulabileceğini merak ediyorum.
blah238

@ blah238 Thread.Exception, düğmenin onclick yöntemine koyduğumda da çalışır. Kullanıcı arayüzüyle etkileşime giren herhangi bir kontrol için işe yaradığını düşünüyorum.
Emi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.