在下面的代码中,我有一个System.Data.Entity.Infrastructure.DbUpdateException
类异常的catch块。
我的问题是为什么我不能使用Exception
类来捕获代码中的每个可能的异常并获得堆栈跟踪?
特定异常类型的优点是什么,以及它们在多个catch块中的使用?
try
{
AddAdminUserInput input1 = JsonConvert.DeserializeObject<AddAdminUserInput>(input);
Foundation_Services_DL_DataEntities Db = DLMetadataContext.GetContext();
UserAccount account = new UserAccount
{
emplid = input1.emplid,
sso = input1.sso,
deptid = input1.deptid,
usertype = input1.usertype,
status = input1.status,
username = input1.username
};
Db.UserAccounts.Add(account);
Db.SaveChanges();
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("status", "0");
dict.Add("message", "User Addition Successful");
Context.Response.Write(JsonConvert.SerializeObject(dict));
}
catch (System.Data.Entity.Infrastructure.DbUpdateException dbev)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("status", "1");
dict.Add("message", "User Addition Failed - User Already Exists");
Context.Response.Write(JsonConvert.SerializeObject(dict));
}
答案 0 :(得分:7)
特定异常类型的优点是什么,以及它们在多个catch块中的使用?
提出同一问题的更好方法是“捕获不太具体的异常类型有什么缺点。”这个问题的答案非常简单:你可能会无意中发现一个你不知道如何处理的异常。
通常,代码只有在知道如何处理异常时才会捕获异常,例如报告错误,使用计数器重试,要求最终用户决定如何继续,等等。仅当您将捕获的异常限制为特定组(例如DbUpdateException
。
捕获特定异常的一个很好的“奖励”是,您可以访问仅在特定子类上定义的属性和方法。例如,DbUpdateException
会告诉您哪些条目无法通过Entries
属性保存,这样您就有机会尝试重试。
最后,某些例外只能在您的程序的顶层捕获。这些异常表示编程错误 - 例如,访问null
引用,访问结束时的数组或负索引,除以零等等。您的程序无法从这些错误中恢复,因为修复它们需要更改代码。因此,程序唯一能做的就是在退出或启动重启序列之前记录或报告异常。
答案 1 :(得分:0)
您可以使用catch all异常但如果您想要以不同方式处理特定异常,则单独处理它们会很有用。在您的示例中,您将添加到字典中,然后可以提供一些有用的反馈而不是崩溃。你无法做到所有阻止。
我使用过的一些代码的例子:
catch (System.Runtime.InteropServices.COMException comException)
{
// Logout has already occurred
this.VerboseLog($"Disconnect not required. ERROR LOGGED BUT WILL BE IGNORED; {comException}");
}
catch (Exception ex)
{
this.ErrorLog(ex);
throw;
}
在第一次捕获中,错误并不是真正的问题;它正在被记录但它可以继续运行。在第二次捕获时,错误是一个问题,它被写入日志但是它不会被进一步处理,因为我们不知道它是什么或者用它做什么。
答案 2 :(得分:0)
没有什么可以阻止你捕获Exception,但除非你只想记录异常并重新抛出异常,否则不建议它。
捕获特定的异常允许您处理您知道如何修复的特定方案。
有一些关于例外的非常好的信息,它们的行为方式以及如何最好地处理它们https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/