Complemento ArcGIS 10: manejo de excepciones de nivel superior

10

El complemento ArcGIS 10 en el que estoy trabajando es bastante simple: solo un control de herramienta y una ventana acoplable. Estoy manejando las excepciones específicas que preveo que ocurran en la fuente y lanzo todo lo demás, pero ¿cuál es la mejor práctica para manejar esas excepciones inesperadas en el marco de complementos?

Actualmente solo estoy haciendo una catch (System.Exception ex)y mostrándola en un MessageBox en cada método que no tiene un método de nivel superior en el que pueda manejarlo, pero esto no parece ser la mejor práctica (y, por supuesto, FxCop se queja) al respecto).

¿Existe alguna instalación en el marco de complementos de ArcGIS 10 para conectar un controlador de excepciones de nivel superior, por ejemplo a los eventos Application.ThreadExceptiono AppDomain.UnhandledException?

Como los complementos son solo bibliotecas de clases y no aplicaciones sin acceso al código de inicio de la aplicación subyacente (por lo que deduzco, esos eventos tienen que conectarse muy temprano en el proceso de inicio), supongo que no, pero pensé Preguntaría si algún experto por ahí tiene alguna sugerencia sobre cómo se deben manejar las excepciones "inesperadas" en los complementos.

blah238
fuente
1
Solo para tu información: aquí hay un enlace tratando de arreglar esto un poco en esri
Erik L
@ blah238 ¿Qué has hecho para resolver tu problema? ¿Me puede dar algunos consejos para manejar excepciones no manejadas?
Emi
Coloque un controlador de excepciones en cada punto de entrada a su código.
blah238
En cada punto de entrada? !! ¿No hay otra forma de manejarlo desde el nivel superior?
Emi
Ese es mi entendimiento, sí. Vea el enlace @baens arriba si desea ver esto mejorado.
blah238

Respuestas:

7

Por lo que puedo decir, está implementando el manejo de errores que ESRI está implementando actualmente como la mejor práctica. Si tuviera que apoderarse de las excepciones no controladas de la aplicación ( ArcMap ), podría mostrar mensajes sobre errores que no formaban parte de su complemento. La mayoría de los AddIns que escriba probablemente serán botones y esos solo tienen dos rutas principales en las que se detectarían y mostrarían errores inesperados ( onClick y onUpdate ).

Solo recuerda usar el ' throw ' en lugar de ' throw ex '. Hay una pequeña diferencia, pero resulta en retener el linaje del error a medida que emerge de las funciones llamadas.

Troy Schmidt
fuente
Gracias, esto es lo que esperaba que fuera el caso ya que todas las muestras de ESRI lo hacen de la misma manera.
blah238
@Troy Schmidt, ¿podría darme un puntero sobre cuándo estoy usando una ventana acoplable, cómo puedo manejar las excepciones no controladas? ¿Y desde dónde y qué debo "tirar"?
Emi
2

Estoy trabajando con un complemento de ArcGIS. Mi complemento consiste en una ventana acoplable y un control de herramienta. Estoy tratando de mantener un registro del bloqueo de ArcGIS debido a mi herramienta. Y obtengo algo de éxito en el manejo de excepciones de nivel superior usando Application.ThreadException. Como la excepción de subproceso funciona solo para el subproceso de interfaz de usuario, después de crear una instancia de la ventana acoplable, cualquier excepción que pueda causar un bloqueo de ArcGIS, lo detecta, pero no funciona antes de crear una instancia de la ventana acoplable.

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

Esto hace el manejo de excepciones de nivel superior después de instanciar la IU

Emi
fuente
Interesante, gracias por publicar sus hallazgos. Tendré que jugar con esto. En particular, me pregunto si la ventana acoplable es realmente necesaria o si podría configurarse en una extensión.
blah238
@ blah238 Thread.Exception también funciona cuando lo pongo en el método onclick del botón. Creo que funciona para cualquier control que interactúa con la interfaz de usuario.
Emi