我实现了一个可编辑的DBGrid。如果未正确填充字段,则抛出异常并显示消息,例如:
'08:00::00' is not a valid time
如何捕获这些异常,以便显示由我编写的消息而不是自动生成的消息?我会感谢任何帮助。
答案 0 :(得分:4)
正如@teran在他的评论中指出的那样,异常是由绑定到TDataSet
的{{1}}(或其中一个组件)或数据库引擎本身引发的。
您可以尝试处理TDBGrid
(另请参阅TDataSet.OnPostError
和OnUpdateError
):
TDataSet.OnPostError:在应用程序尝试修改或插入记录时发生 提出了一个例外。编写一个OnPostError事件处理程序来处理 尝试发布记录失败时发生的异常。
请注意,您始终可以使用OnEditError
全局事件处理程序来捕获应用程序中的任何EDBxxx异常。
编辑: Application.OnException
例外是之前任何实际数据修改,或EConvertError
字段的任何Post操作,即:
TDateTimeField
0045af91 +085 Project1.exe SysUtils StrToDateTime <- EConvertError
004ab76a +042 Project1.exe Db TDateTimeField.SetAsString
004a9827 +007 Project1.exe Db TField.SetText
004a95d9 +029 Project1.exe Db TField.SetEditText
004d6448 +014 Project1.exe DBGrids TCustomDBGrid.UpdateData
004d087f +02b Project1.exe DBGrids TGridDataLink.UpdateData
004d599a +01a Project1.exe DBGrids TCustomDBGrid.MoveCol
在StrToDateTime
内抛出异常,而不是触及数据,而且
根本不会解雇TDateTimeField.SetAsString
事件处理程序。
所以你的选择是(在发布模式下测试应用程序):
1.通过TDataSet.OnxxxError
接受并处理EConvertError
2.使用Application.OnException
将用户输入限制为有效的时间格式,例如TField.EditMask
或使用就地DateTimePicker editor inside your Grid。 (并避免捕获此例外)
3.Override !90:00;1;_
:使用TDateTimeField
的持久字段并创建一个inter-poser类:
TDataSet
答案 1 :(得分:1)
如果引发异常,则在调试器中运行时应显示两条错误消息。其中一个将由调试器捕获,第二个由UI处理(当以用户身份运行程序时,您将只看到第二个)。
异常错误消息应包含类似
的字符串Appname.exe引发了带有消息XXX的异常EExceptionName
您需要注意EExceptionName。
围绕创建异常的代码块,您需要编写
...
try
code that can cause the exception here
except
on e: EExceptionName do
begin
ShowMessage('Your apps nicer error message here');
end;
end;
注意 - 如果你没有打电话退出;在处理异常之后,您的代码将在try..except块之后继续执行所有操作。此外,如果有许多事情可能导致相同的代码块中出现相同的错误消息,那么您可能无法编写任何过于具体的内容。 e.Message是一个字符串,用于保存未处理的异常中显示的消息,并且可能对向用户显示也很有用。
还试图摆脱BDE - 现代系统支持ADO。