Como pegar todas as exceções em C# usando tentar e pegar?

Eu quero escrever alguns tentar e pegar que pegar qualquer tipo ou exceção, este código é suficiente (essa é a maneira de fazer em Java)?

try {
code....
}
catch (Exception ex){}

ou deveria ser

try {
code....
}
catch {}

?

 35
c#
Author: Gorden Gram, 2012-10-16

8 answers

Ambas as abordagens apanharão todas as excepções. Não há diferença significativa entre os seus dois exemplos de código, exceto que o primeiro irá gerar um aviso de compilador porque ex é declarado, mas não usado.

Mas note que algumas exceções são especiais e serão repostas automaticamente.

ThreadAbortException é uma excepção especial que pode ser capturada, mas será automaticamente levantada novamente no final da captura bloco.

Http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx


Como mencionado nos comentários, é geralmente uma Muito má ideia apanhar e ignorar todas as excepções. Normalmente você quer fazer um dos seguintes em vez disso:

  • Apanha e ignora uma excepção específica que sabes que não é fatal.
    catch (SomeSpecificException)
    {
        // Ignore this exception.
    }
    
  • Captura e registo de todas as excepções.

    catch (Exception e)
    {
        // Something unexpected went wrong.
        Log(e);
        // Maybe it is also necessary to terminate / restart the application.
    }
    
  • Apanhar todos exceções, fazer alguma limpeza, e então repensar a exceção.

    catch
    {
        SomeCleanUp();
        throw;
    }
    

Note que, no último caso, a excepção é restabelecida utilizando throw; e não throw ex;.

 44
Author: Mark Byers, 2012-10-16 09:58:54

Todas as excepções derivam de {[[0]}, por isso ambas as excepções funcionariam.

Mas pergunto-lhe porque quer fazer isto. Você só deve pegar exceções que são recuperáveis.. tudo o resto deve fazer com que a tua candidatura tenha uma morte horrível e ardente. É melhor a sua aplicação falhar do que ter que continuar com o estado possivelmente corrupto.
 3
Author: Simon Whitehead, 2012-10-16 09:49:24

Note que além de todos os outros comentários há uma pequena diferença, que deve ser mencionada aqui para completar!

Com a cláusula de captura vazia, pode apanhar excepções não conformes à CLSC quando a montagem está marcada com" compatibilidade em tempo real(WrapNonExceptionThrows = false) " (O que é verdadeiro por omissão desde CLR2). [1][2][3]

[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx

[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx

[3] a CLR tratará tanto da queixa CLS como das excepções não CLS?

 3
Author: matthid, 2017-05-23 10:30:46

Ambos estão bem, mas apenas o primeiro permitirá que você inspecione a própria exceção.

Ambos engolem a excepção, e só devem apanhar excepções para fazer algo que seja importante. Esconder um problema não é significativo!

 1
Author: RvdK, 2012-10-16 09:48:45

Apanho todas as excepções e guardo-as na base de dados, para que os erros possam ser corrigidos facilmente - a página, o local, a data, etc.

try
{     
   Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault();
}
catch (Exception e)
{
    ErrorReport.StoreError("CartMinifiedPartial-Company", e);  
    -- storing the error for reference
}

Conservação

public static void StoreError(string ErrorPage, Exception e)
    {
        try
        {
            eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1();
            eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable();
            Err.ErrorPage = ErrorPage;
            if (e.Message != null)
            {
                Err.ErrorDetails = e.Message;
            }
            if (e.InnerException != null)
            {
                Err.InnerException = e.InnerException.Message.ToString();
            }

            Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
            DB.ErrorTables.AddObject(Err);
            DB.SaveChanges();
}
 1
Author: Arun Prasad E S, 2016-07-21 11:36:27

Ambos os lados estão correctos. Se precisar de fazer alguma coisa com excepção do objecto no bloco de captura do que deve utilizar

try {
code....
}
catch (Exception ex){}

E que utilizar ex no bloco de captura.

De qualquer forma, nem sempre é uma boa prática cathc a classe de exceção, é uma prática beter cathc uma exceção mais específica - uma exceção que você pode esperar.
 0
Author: Dejo, 2012-10-16 09:50:50
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        throw new NotImplementedException();
    }
 0
Author: Reza Mahmoodi, 2016-09-27 08:15:18

Tenta {

.. .. ..

}

Capturas(excepção ex) {

.. .. ..

} a excepção ex significa todas as excepções.

 -1
Author: zzz, 2017-06-18 00:14:54