【发布时间】:2013-04-14 07:50:37
【问题描述】:
对于我的一些程序和函数,我已经对参数实施了各种检查,以便在参数以某种方式超出范围时强制停止执行。 我发现最好在我自己的代码中检查这一点,而不是由于内存写入错误而导致异常崩溃。
考虑一下简单的代码:
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”
即使是说这是不可能的答案也会很有用(如果您确定这是不可能的),因为那样我就会忘记这一点并制定另一种调试方法。
【问题讨论】:
-
当在调试器下引发异常时,您可以查看调用堆栈,根据您的示例,调用堆栈将具有第一项 ProduceErrorMessage(意味着这是引发异常的位置),第二项是 Test(调用 ProduceErrorMessage 过程的过程),第三项是调用 Test 的函数/过程/方法。
-
@ComputerSaysNo - 谢谢你的提示 :) 我不知道这一点。也许可以在引发异常之前使用调用堆栈?只是让它倒退两到三步?
-
不要弄乱调用堆栈。它会给你带来比现在更多的麻烦。或许检查一下。并使用您在异常消息中找到的内容。 Exception 类确实提供了对较新版本中的调用堆栈的访问,但它要求已经创建了异常,甚至可能引发了异常。在后一种情况下,您必须引发异常并在函数中捕获它,以便您可以修改消息,然后重新引发它以传播到调用代码。有点乱,但可以做到。
-
我正要发表一篇阐述。
-
一个更具理论性的问题。您在这里测试先决条件,并且该测试应该在您的例程外部进行,而不是在内部进行。这与直觉相反,但这就是您编写干净代码的方式。如果调用者问了一些没有意义的问题,你不能指望被调用者处理他的情况。为了安全起见,您可以在例程中添加断言,但您可能永远不会依赖例程之外的断言。否则,您可能会失去正式接受其他类型输入的先决条件。
标签: delphi