ArcGIS 10 애드 인 : 최상위 예외 처리


10

내가 작업하고있는 ArcGIS 10 애드 인은 매우 간단합니다. 도구 컨트롤과 고정 가능한 창일뿐입니다. 소스에서 발생할 것으로 예상되는 특정 예외를 처리하고 다른 모든 것을 던지고 있지만 추가 기능 프레임 워크에서 예기치 않은 예외를 처리하는 가장 좋은 방법은 무엇입니까?

현재 catch (System.Exception ex)처리 할 수있는 높은 수준의 방법이없는 모든 방법에서 MessageBox에 메시지 상자에 표시하고 있지만 모범 사례처럼 보이지는 않습니다 (물론 FxCop은 그것에 대해).

ArcGIS 10 애드 인 프레임 워크에 최상위 예외 처리기를 예를 들어 Application.ThreadException또는 AppDomain.UnhandledException이벤트에 연결할 수있는 기능이 있습니까?

추가 기능은 클래스 라이브러리이며 기본 응용 프로그램의 시작 코드에 액세스 할 수없는 응용 프로그램이 아닌 것으로 보았습니다 (내가 수집 한 것부터 시작하는 과정에서 이벤트가 매우 일찍 연결되어야 함). 추가 기능에서 "예기치 않은"예외를 처리하는 방법에 대한 제안이있는 전문가가 있는지 묻습니다.


1
단지 참고 : 여기 에 esri에서이 문제를 해결하려고 하는 링크 가 있습니다.
Erik L

@ blah238 문제를 해결하기 위해 무엇을 했습니까? 처리되지 않은 예외를 처리하기위한 몇 가지 지침을 제공해 주시겠습니까?
Emi

코드의 모든 진입 점에 예외 처리기를 넣으십시오.
blah238

모든 진입 점에서? !! 최상위 수준에서 처리하는 다른 방법이 없습니까?
Emi

그게 내 이해입니다 이 기능을 개선하려면 위의 @baens 링크를 참조하십시오.
blah238

답변:


7

ESRI가 현재 모범 사례로 제시하고있는 오류 처리를 구현하고 있다고 말할 수 있습니다. 응용 프로그램 ( ArcMap )의 처리되지 않은 예외 를 잡아야하는 경우 AddIn의 일부가 아닌 오류에 대한 메시지가 표시 될 수 있습니다. 여러분이 작성하는 대부분의 AddIn은 아마도 버튼 일 것이며, 예상치 못한 오류가 발생하여 표시 될 수있는 두 개의 주요 경로 만 있습니다 ( onClickonUpdate ).

' throw ex ' 대신 ' throw ' 를 사용해야합니다 . 약간의 차이가 있지만 호출 된 함수에서 버블 링 될 때 오류 계보를 유지합니다.


감사합니다. 모든 ESRI 샘플이 동일한 방식으로 수행 할 때 예상되는 결과입니다.
blah238

@Troy Schmidt 도킹 가능한 창을 사용하는 경우 처리 할 수없는 예외를 어떻게 처리 할 수 ​​있습니까? 그리고 어디에서 무엇을 "던져"해야합니까?
Emi

2

ArcGIS 애드 인으로 작업하고 있습니다. 내 애드 인은 고정 가능한 창과 도구 컨트롤로 구성됩니다. 내 도구로 인해 ArcGIS 충돌 로그를 유지하려고합니다. 그리고 Application.ThreadException을 사용하여 최상위 예외 처리에 성공했습니다. 스레드 예외는 UI 스레드에서만 작동하므로 고정 가능한 창을 인스턴스화 한 후 ArcGIS를 중단시킬 수있는 예외는 예외를 포착하지만 고정 가능한 창을 인스턴스화하기 전에는 작동하지 않습니다.

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

UI 인스턴스화 후 최상위 예외 처리를 수행합니다.


흥미로운 결과를 게시 해 주셔서 감사합니다. 나는 이것을 가지고 놀아야 할 것이다. 특히 도킹 가능한 창이 실제로 필요한지 또는 확장에서 설정할 수 있는지 궁금합니다.
blah238

@ blah238 Thread.Exception은 버튼의 onclick 메소드에 넣을 때도 작동합니다. UI와 상호 작용하는 모든 컨트롤에서 작동한다고 생각합니다.
Emi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.