为什么在异常后执行会跳转到proc的末尾?

时间:2009-03-02 08:57:42

标签: delphi exception

当在任何过程/函数/方法中调试某些代码时发生未处理的异常时,调试器会停在那里并显示消息。

如果我现在继续逐步调试,执行会直接从创建异常的行跳转到当前过程的结尾(如果没有finally块)。

继续使用当前程序的下一行是不是很好?

为什么跳转到proc的结尾并继续调用程序? 这只是设计还是有充分的理由呢?

5 个答案:

答案 0 :(得分:7)

异常是意外情况,即处理停止的原因。

跳转到过程的结尾是一个不可见的finally语句,用于释放任何本地“已分配”的内存,如字符串,接口,记录等。

如果要处理异常,则必须填充可以使用try .. except语句提供异常的调用,并使用“on”子句仅处理您要处理的特定异常。

除非您可以在调试器和代码中检查变量,否则可以在需要时再次引发异常。

答案 1 :(得分:6)

通常,未捕获的异常将在堆栈的每个函数中执行隐藏的“finally”,因为它“展开”到异常处理程序。这会清除每个堆栈帧中的局部变量。在像C ++这样的语言中,资源获取是初始化范例,它也会导致析构函数运行。

最终,在callstack的某个地方,异常将由处理程序捕获。如果没有明确的那个,系统提供的将终止进程,因为它还能合理地做什么?

答案 2 :(得分:3)

抛出异常是一种说法“意外发生的事情。我不知道如何处理这个问题”。在这种情况下,最好不要做任何事情(除了抛出异常)而不是试图继续,不知道你所做的事情是否正确。

在现实生活中,你有同样的事情:如果有人要求你用希伯来语(或某种你不知道的语言)数到10,你只是说你不知道。无论如何你都不会继续尝试。

答案 3 :(得分:2)

我希望它跳转到proc的结尾,然后跳转到调用proc的except或finally块。它是否真的继续在调用过程中,好像什么也没发生过?它作为返回值使用了什么(如果是函数调用)?

继续原始proc / function中的下一行将是一件非常糟糕的事情 - 这意味着代码在调试器中以不同方式执行从根本上到发布中(异常确实会导致执行)退出该proc /函数,除非有一个except / finally块)。为什么调试会让你完全忽略异常?

答案 4 :(得分:0)

必须展开堆栈才能找到处理程序。

我同意这是非常讨厌的行为。继续不是一个选项,但如果调试器指向抛出局部变量仍未完整的位置,它肯定会使生活更轻松。显然,下一步将是最终隐藏,而不是下一行。

我只是希望能够检查所有可能导致它的原因。不久前我就是在争吵。文本解析,我 KNEW 违规字符串不包含非数字字符(理智限制意味着溢出情况不应该发生,这是我的数据文件,所有我担心的是oopses)所以我没有不要在StrToInt周围放置一个异常处理程序 - 关于它不是一个有效的数字这是什么废话?????是的 - 例程不会用缓冲区中的任何非数字来调用它 - 但是空字符串中没有任何非数字的字符串!