我想写一些 try and catch 来捕获任何类型或异常,这段代码是否足够(这就是 Java 中的方法)?
try {
code....
}
catch (Exception ex){}
或者应该是
try {
code....
}
catch {}
?
两种方法都会捕获所有异常。您的两个代码示例之间没有显着差异,除了第一个将生成编译器警告,因为ex
已声明但未使用。
但请注意,有些异常是特殊的,会自动重新抛出。
ThreadAbortException
是一个可以被捕获的特殊异常,但它会在 catch 块结束时自动再次引发。
http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx
正如评论中提到的,捕获并忽略所有异常通常是一个非常糟糕的主意。通常,您希望执行以下操作之一:
捕获并忽略您知道不是致命的特定异常。
catch (SomeSpecificException)
{
// Ignore this exception.
}
捕获并记录所有异常。
catch (Exception e)
{
// Something unexpected went wrong.
Log(e);
// Maybe it is also necessary to terminate / restart the application.
}
捕获所有异常,进行一些清理,然后重新抛出异常。
catch
{
SomeCleanUp();
throw;
}
throw;
请注意,在最后一种情况下,使用and not重新抛出异常throw ex;
。
请注意,除了所有其他注释之外,还有一个小的差异,为了完整起见,应该在这里提及!
当程序集标记为“RuntimeCompatibility(WrapNonExceptionThrows = false)”(自 CLR2 以来默认为 true)时,使用空的 catch 子句可以捕获非 CLSCompliant 异常。[1][2][3]
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
我捕获所有异常并将其存储在数据库中,因此可以轻松纠正错误 - 存储的页面、地点、日期等
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
}
存储
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();
}
两者都很好,但只有第一个允许您检查异常本身。
两者都吞下异常,你应该只捕获异常来做一些有意义的事情。隐瞒问题没有意义!
两种方式都是正确的。
如果你需要对 catch 块中的 Exception 对象做一些事情,那么你应该使用
try {
// code....
}
catch (Exception ex){}
然后ex
在 catch 块中使用。
无论如何,捕捉 Exception 类并不总是一个好习惯,捕捉一个更具体的异常是一个更好的做法——一个你期望的异常。
try
{
..
..
..
}
catch(Exception ex)
{
..
..
..
}
Exception ex 表示所有异常。