Gau*_*rav 5 c# try-catch 3-tier
我有一个基于3层的Web应用程序.我想使用我在业务逻辑层中使用try catch块.在业务逻辑中使用try/catch块是正确的还是我需要在我的UI层中使用它?
看我的DAL代码.
Data Access Layer
#region Insert in to Logbook
public int Insert_LogBook(string Vehicle_Number, DateTime Vehicle_Booking_Date, TimeSpan Time_From, TimeSpan Time_To, int KM_Start, int KM_End, string Vehicle_Used_By, string Cost_Code, string Budget_Line, DateTime Entry_Date)
{
try
{
SqlCommand com = new SqlCommand("Insert_LogBook", con);
com.Parameters.Add("@Vehicle_Number", SqlDbType.NVarChar, 100).Value = Vehicle_Number;
com.Parameters.Add("@Vehicle_Booking_Date", SqlDbType.DateTime).Value = Vehicle_Booking_Date;
com.Parameters.Add("@Time_From", SqlDbType.Time).Value = Time_From;
com.Parameters.Add("@Time_To", SqlDbType.Time).Value = Time_To;
com.Parameters.Add("@KM_Start", SqlDbType.Int).Value = KM_Start;
com.Parameters.Add("@KM_End", SqlDbType.Int).Value = KM_End;
com.Parameters.Add("@Vehicle_Used_Byr", SqlDbType.VarChar, 100).Value = Vehicle_Used_By;
com.Parameters.Add("@Cost_Code", SqlDbType.NVarChar, 50).Value = Cost_Code;
com.Parameters.Add("@Budget_Line", SqlDbType.NVarChar, 50).Value = Budget_Line;
com.Parameters.Add("@Entry_Date", SqlDbType.DateTime).Value = Entry_Date;
con.Open();
int res = com.ExecuteNonQuery();
}
catch (Exception ex)
{
WebMsgBox.Show(ex.Message);
}
finally
{
con.Close();
con.Dispose();
}
return 1;
}
#endregion
Run Code Online (Sandbox Code Playgroud)
所以我应该在我的bal OR IN UI层中使用它还是我的代码没问题.因为如果我在UI层中不使用try/catch,它将不会捕获异常(如果有的话)并显示错误页面.
对于我曾经使用过的大多数开发人员来说,异常处理和抛出是我一直被误解的事情.
你可以而且应该在任何地方使用try/catch /(终于),但......
只有当您知道可能发生哪些异常并且可以从中恢复时,才使用catch.您应该很少捕获基本的Exception类型.允许所有其他错误冒出来,并由程序员/测试人员/用户找到.
如果要抛出另一个异常并将原始异常作为InnerException附加,则可能需要捕获基本异常类型.
关于创建自己的异常类型,你不应该三思而后行.例如,您可能希望编写一个DataAccessException,并将其与在InnerException中附加的层中捕获的异常一起抛出.这样,您的日志记录将记录一个异常类型,该类型更准确地显示错误发生的位置,并且调用代码只能选择捕获DataAccessException并执行重试等.
您还可以考虑使DataAccessException抽象并继承更多特定的异常,如SqlDataAccessException或SecurityDataAccessException.
如您所知,当您想要确保在发生错误时运行某些代码时,即使您没有捕获并处理异常本身,也可以使用finally.在必须始终释放资源的情况下,try/finally将成为标准模式.
此外,如果可能的话,将try/catch放在最能够处理错误的特定代码补丁周围,允许编码周围代码中的错误来破坏应用程序.
您可能会想,"如果我还不知道会抛出哪些异常,我怎么能捕获一个特定的异常?" 您应该看到它们记录在ExecuteNonSql方法上,这就是为什么用它抛出的异常来记录您自己的API /组件是如此重要.使用XML注释执行此操作,如果运送公共DLL,请打开XML注释文件生成器.
这可能看起来很多,但它不在实践中.当你投资日志记录和适当的异常处理/投掷时,你将能够在几分钟内解决错误,你会感觉像冠军,你很快就会学会对其他人的糟糕代码感到不安:)
在编程生涯的这个阶段,我强烈建议阅读Cwalina和Abrams的框架设计指南.它将帮助您快速做出关于所有这些类型问题的正确选择,并且您会发现使用自己的代码与使用Microsoft的API(大多数)一样快乐.
卢克
添加一些关于消息的内容.我在错误消息中使用了这种东西.
"无法{执行某些功能}.发生了{类型的异常}.{提供补救建议或错误的常见原因}.请参阅{内部异常|更多日志条目}."
例如,在应用程序中自动保存状态的组件中:
...
catch(FileNotFoundException fnfe)
{
string m = String.Format("Cannot save changes. A FileNotFoundException occurred. Check the path '{0}' is valid, that your network is up, and any removable media is available. Please see inner exception.", path);
_log.Error(m, fnfe);
throw new StorageLifecycleException(m, fnfe);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6346 次 |
| 最近记录: |