Suplemento ArcGIS 10: tratamento de exceção de nível superior


10

O complemento do ArcGIS 10 em que estou trabalhando é bastante simples - apenas um controle de ferramenta e uma janela acoplável. Estou lidando com as exceções específicas que prevejo ocorrer na fonte e lançando todo o resto, mas qual é a melhor prática para lidar com essas exceções inesperadas na estrutura de suplementos?

Atualmente, estou apenas fazendo um catch (System.Exception ex)e mostrando em um MessageBox em todos os métodos que não possuem um método de nível superior em que eu possa lidar, mas isso não parece a melhor prática (e, é claro, o FxCop está choramingando) sobre isso).

Existe alguma facilidade na estrutura de complemento do ArcGIS 10 para que um manipulador de exceção de nível superior seja conectado, por exemplo, aos eventos Application.ThreadExceptionou AppDomain.UnhandledException?

Como os suplementos são apenas bibliotecas de classes e não aplicativos sem acesso ao código de inicialização do aplicativo subjacente (pelo que eu entendo, esses eventos precisam ser conectados muito cedo no processo de inicialização), acho que não, mas pensei Gostaria de perguntar se algum especialista lá fora tem alguma sugestão sobre como exceções "inesperadas" devem ser tratadas em suplementos.


1
Apenas FYI: aqui está um link de tentar obter este fixo um pouco em ESRI
Erik L

@ blah238 O que você fez para resolver seu problema? Você pode me dar algumas dicas para lidar com exceções não tratadas?
Emi

Coloque um manipulador de exceção em cada ponto de entrada do seu código.
precisa saber é

Em todo ponto de entrada? !! Não há outra maneira de lidar com isso de nível superior?
Emi

Esse é o meu entendimento, sim. Consulte o link @baens acima se você quiser ver isso melhorado.
precisa saber é

Respostas:


7

Tanto quanto posso dizer, você está implementando o tratamento de erros que a ESRI está lançando no momento como prática recomendada. Se você agarrar as exceções não tratadas do ArcMap (aplicativo ), poderá exibir mensagens sobre erros que não fazem parte do seu AddIn. A maioria dos AddIns que você escreve provavelmente será de botões e esses realmente têm apenas duas rotas principais para que erros inesperados sejam capturados e exibidos ( onClick e onUpdate ).

Lembre-se de usar o ' throw ' em vez de ' throw ex '. Há uma diferença minuciosa, mas resulta em reter a linhagem do erro, à medida que borbulha das funções chamadas.


Obrigado, é o que eu esperava que fosse o caso, pois todas as amostras de ESRI fazem da mesma maneira.
blah238

@Troy Schmidt, por favor, me dê uma dica sobre quando estou usando uma janela acoplável, como posso lidar com exceções não tratadas? E de onde e o que devo "jogar"?
Emi

2

Estou trabalhando com um suplemento do ArcGIS. Meu suplemento consiste em uma janela acoplável e um controle de ferramenta. Estou tentando manter o registro da falha do ArcGIS por causa da minha ferramenta. E obtive algum sucesso no tratamento de exceções de nível superior usando Application.ThreadException. Como a exceção de encadeamento funciona apenas para o encadeamento da interface do usuário, após instanciar a janela acoplável, qualquer exceção que possa causar uma falha no ArcGIS, ela captura isso, mas não funciona antes de instanciar a janela acoplável.

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

Isso manipula exceções de nível superior após instanciar a interface do usuário


Interessante, obrigado por postar suas descobertas. Vou ter que brincar com isso. Em particular, me pergunto se a janela acoplável é realmente necessária ou se pode ser configurada em uma extensão.
blah238

@ blah238 O Thread.Exception também funciona quando o coloco no método onclick do botão. Eu acho que funciona para qualquer controle que interaja com a interface do usuário.
Emi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.