iam*_*esy 69 sql vb.net exception
我已经开始使用try catch块了(有点晚了,我知道!),但是现在我不知道一旦我抓住它就该如何处理异常.我该怎么办?
Try
connection.Open()
Dim sqlCmd As New SqlCommand("do some SQL", connection)
Dim sqlDa As New SqlDataAdapter(sqlCmd)
sqlDa.Fill(dt)
Catch ex As SQLException
' Ahhhh, what to do now!!!?
Finally
connection.Close()
End Try
Run Code Online (Sandbox Code Playgroud)
小智 64
异常处理的经验法则 - 如果您不知道如何处理它,请不要捕获它.
对于异常处理的经验法则的计算 - 在最后一个负责的时刻处理异常.如果你不知道这是否是最后一个负责任的时刻,那就不是.
Nib*_*Pig 23
你想要它做什么?这完全取决于您的应用程序.
你可以让它重试,你可以在屏幕上显示一个消息框,写入日志,可能性是无穷无尽的.
作为开发人员,您无法预测每个可能的错误.即使您不知道如何修复错误,也可以使用通用捕获代码.您可能正在保存到数据库,并且可能会发生50个数据库错误之一,并且您将无法编写代码来处理每个错误.
你应该放入一个通用的catch来确保你的程序不会简单地崩溃,并且在某些情况下只是显示错误并让他们再次进行就足够了.想象一下,如果原因是"磁盘已满".您只能打印出异常,让用户再试一次 - 他们知道该怎么做,并自己解决问题.
这就是为什么我不同意如果你不知道该怎么做就不处理它的评论.您应该始终处理它,即使它只是显示一个消息框说"错误",因为它比"此程序执行了非法操作并将被关闭"无限好.
Joe*_*orn 14
如果您不知道如何处理它,我会看到许多建议不要抓住它.那是对的.您应该捕获异常,但可能不在此级别.使用您的代码作为示例,我会更像这样写:
Using connection As New SqlConnection("connection string here"), _
sqlCmd As New SqlCommand("do some SQL", connection), _
sqlDa As New SqlDataAdapter(sqlCmd)
sqlDa.Fill(dt)
End Using
Run Code Online (Sandbox Code Playgroud)
不仅没有Try/Catch /最后,没有开放或关闭..Fill()函数被记录为在需要时打开连接,并且即使抛出异常,Using块也会确保它被正确关闭.
这使您可以自由地捕获更高级别的异常 - 在UI或业务代码中调用运行查询的函数,而不是在查询本身.这个更高级别的代码可以更好地决定如何继续,需要发生什么日志记录,或向用户显示更好的错误消息.
事实上,正是这种异常的能力在你的代码中"冒泡",使它们变得如此有价值.如果你总是在抛出异常的地方捕获异常,那么异常并没有在vb的旧"On Error Goto X"语法之外增加很多值.
这取决于SQL真正做到了什么.是这样的:
从这些问题开始,他们通常会得到关于如何处理异常的答案
除非你期望错误(API说它可以发生)并且可以处理它(如果发生异常,有一个明显的步骤),你可能想要崩溃很多噪音.这应该在测试/调试期间发生,以便在用户看到之前修复bug!
当然,正如评论者指出的那样,用户永远不应该真正看到所有这些噪音.高级别try/catch或其他方法(EMLAH,我听说.net网站项目)可以用来向用户显示一个很好的错误消息("糟糕!出了点问题!你到底想做什么?")提交按钮......
所以基本上,我的观点是:不要抓错,你不知道如何处理!(除了高级处理程序).尽早崩溃并尽可能多地提供信息.这意味着您应该记录调用堆栈和其他重要信息(如果可能的话)进行调试.