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