delphi - 在 Delphi 中创建或强制错误

标签 delphi

对于我的一些程序和函数,我对参数实现了各种检查,以便在参数以某种方式超出范围时强制停止执行。 我发现最好在我自己的代码中检查这一点,而不是由于可能错误的内存写入而导致异常崩溃。

考虑简单的代码:

PROCEDURE Test(OneDigitNumbers:BYTE);
BEGIN
  IF OneDigitNumbers>9 THEN ProduceErrorMessage;
END;

begin
  Test( 1);
  Test( 2);
  Test( 9);
  Test(12);
end.

我在实际生成错误消息时没有问题,我唯一的“问题”是 Delphi 中的调试器总是指向创建异常的过程。 是否有创建此异常或错误消息的方法,以便调试器指向参数超出范围的行? 在我的例子中,它应该指向:

Test(12);

也许会说“参数超出范围。有效范围是 0-9。传递的参数是:12”

即使是说这是不可能的答案也会有用(如果您确定这是不可能的),因为那样我就会忘记它并使用替代方法进行调试。

最佳答案

要按要求回答问题,您可以使测试函数内联:

procedure Test(OneDigitNumbers: byte); inline;

然后编译器会将测试代码写入每个调用函数中。虽然你可以这样做,但我的建议是你不要这样做。这只是一个技巧,但我认为它对您没有真正的帮助。

如果你想在返回地址抛出异常,你可以这样做:

raise Exception.CreateFmt(
  'Exception blah blah at %p.',
  [ReturnAddress]
) at ReturnAddress;

如果你想在堆栈中走得更远,那么你必须使用类似 CaptureStackBackTrace 的东西.将反向跟踪与 raise at 结合起来,如果您真的认为这是个好主意,则可以在调用堆栈中的任何位置引发异常。正如我在下面解释的那样,我认为这不是一个好主意。

如果您使用一个好的调试工具,例如 madExcept,那么 madExcept 错误报告中的调用堆栈会告诉您发生错误时需要知道的所有信息。


通过注释中的额外说明,您真正想要发生的似乎是异常包含来自调用堆栈更高层的信息。在我看来,要求被调用者报告有关其调用者的信息是违反封装的。所以如果你想包含来自调用者的信息,让调用者捕获异常,添加信息,然后重新引发。

关于delphi - 在 Delphi 中创建或强制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15996898/

相关文章:

Delphi 窗体以自定义构造函数作为主窗体?

delphi - 使用初始化部分进行模块注册是个好主意吗?

delphi - 外部异常 C0000006

delphi - 为什么从 Delphi 关闭文档后 WINWORD.EXE 不退出?

delphi - 如何确定我的项目在哪里引入了我不想使用的模块?

delphi - TEventLogger 有灯吗?

delphi - SkypeKit 与使用 Skype API 编程有何不同?

delphi - 如何使用 DELPHI 中用 C 编写的外部 DLL

delphi - 在Delphi 2010中构建虚拟Treeview的步骤

Delphi 堆栈错位 + com 编码 = 错误编码