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 {}
?
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.
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;
.
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.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?
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!
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();
}
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. static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
Tenta {
.. .. ..
}
Capturas(excepção ex) {
.. .. ..
} a excepção ex significa todas as excepções.