Bổ trợ ArcGIS 10: Xử lý ngoại lệ cấp cao nhất


10

Bổ trợ ArcGIS 10 tôi đang làm việc khá đơn giản - chỉ cần điều khiển công cụ và cửa sổ có thể gắn được. Tôi đang xử lý các trường hợp ngoại lệ cụ thể mà tôi dự đoán sẽ xảy ra tại nguồn và ném mọi thứ khác, nhưng cách tốt nhất để xử lý các ngoại lệ không mong muốn đó trong khung bổ trợ là gì?

Tôi hiện chỉ đang thực hiện catch (System.Exception ex)và hiển thị nó trong MessageBox trong mọi phương thức không có phương thức cấp cao hơn mà tôi có thể xử lý, nhưng đây có vẻ không phải là cách thực hành tốt nhất (và tất nhiên, FxCop đang than vãn về nó).

Có bất kỳ cơ sở nào trong khung bổ trợ ArcGIS 10 để trình xử lý ngoại lệ cấp cao nhất được kết nối, ví dụ như cho các sự kiện Application.ThreadExceptionhoặc AppDomain.UnhandledExceptionsự kiện không?

Xem như bổ trợ chỉ là thư viện lớp chứ không phải ứng dụng không có quyền truy cập vào mã khởi động của ứng dụng cơ bản (từ những gì tôi thu thập được, những sự kiện đó phải được kết nối từ rất sớm trong quá trình khởi động), tôi đoán là không, nhưng tôi nghĩ Tôi muốn hỏi liệu có chuyên gia nào ngoài đó có bất kỳ đề xuất nào về cách xử lý ngoại lệ "không mong muốn" trong bổ trợ không.


1
Chỉ cần FYI: đây là một liên kết đang cố gắng sửa lỗi này một chút tại esri
Erik L

@ blah238 Bạn đã làm gì để giải quyết vấn đề của mình? Bạn có thể vui lòng cho tôi một số gợi ý để xử lý các trường hợp ngoại lệ chưa được xử lý?
Emi

Đặt một trình xử lý ngoại lệ tại mỗi điểm nhập mã của bạn.
blah238

Tại mọi điểm vào? !! Không có cách nào khác để xử lý nó từ cấp cao nhất?
Emi

Đó là sự hiểu biết của tôi, vâng. Xem liên kết @baens ở trên nếu bạn muốn thấy điều này được cải thiện.
blah238

Câu trả lời:


7

Theo như tôi có thể nói với bạn là đang triển khai xử lý lỗi mà ESRI hiện đang đưa ra ngoài đó là cách thực hành tốt nhất. Nếu bạn đã nắm được các ngoại lệ chưa được xử lý của ứng dụng ( ArcMap ), thì bạn có khả năng sẽ hiển thị các thông báo về các lỗi không phải là một phần của AddIn của bạn. Hầu hết các AddIn bạn viết có thể sẽ là các nút và những nút này thực sự chỉ có hai tuyến chính mà các lỗi không mong muốn sẽ bị bắt và hiển thị ( onClickonUpdate ).

Chỉ cần nhớ sử dụng ' ném ' thay vì ' ném ex '. Có một sự khác biệt nhỏ, nhưng nó dẫn đến việc giữ lại dòng dõi của lỗi khi nó nổi lên từ các hàm được gọi.


Cảm ơn, đây là điều tôi mong đợi là trường hợp vì tất cả các mẫu ESRI đều làm theo cách tương tự.
blah238

@Troy Schmidt bạn có thể vui lòng cho tôi một con trỏ về khi tôi đang sử dụng cửa sổ có thể gắn được không, làm cách nào tôi có thể xử lý các ngoại lệ chưa được xử lý? Và từ đâu và tôi nên "Ném" cái gì?
Emi

2

Tôi đang làm việc với một bổ trợ ArcGIS. Bổ trợ của tôi bao gồm một cửa sổ có thể gắn được và điều khiển công cụ. Tôi đang cố gắng để giữ nhật ký sự cố ArcGIS vì công cụ của tôi. Và tôi nhận được một số thành công khi xử lý ngoại lệ cấp cao nhất bằng Application.ThreadException. Vì ngoại lệ luồng chỉ hoạt động đối với luồng UI, sau khi khởi tạo cửa sổ có thể gắn được, bất kỳ ngoại lệ nào có thể gây ra sự cố cho ArcGIS, nó sẽ bắt được điều đó, nhưng nó không hoạt động trước khi khởi tạo cửa sổ có thể gắn được.

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

Điều này thực hiện xử lý ngoại lệ cấp cao nhất sau khi khởi tạo UI


Thật thú vị, cảm ơn vì đã đăng những phát hiện của bạn. Tôi sẽ phải chơi xung quanh với điều này. Cụ thể, tôi tự hỏi nếu cửa sổ có thể gắn được là thực sự cần thiết hoặc nếu nó có thể được thiết lập trong một phần mở rộng.
blah238

@ blah238 Thread.Exception cũng hoạt động khi tôi đặt nó vào phương thức onclick của nút. Tôi nghĩ rằng nó hoạt động cho bất kỳ điều khiển tương tác với UI.
Emi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.