例外和取消

时间:2010-09-20 16:50:48

标签: exception

这可能是一个愚蠢的问题,但它一直在困扰我,所以这里

我知道正常的建议是,例外只是在特殊情况下使用,但我也读过那些主张在方法未能履行合同时使用例外的人

在这两种情况之间,我似乎处于取消状态

如果您的课程中有很多可取消的操作,那么您的代码最终会在整个地方重新检查错误代码

在这种背景下取消可以被视为例外吗?

3 个答案:

答案 0 :(得分:2)

例外对于需要非本地处理的罕见情况最有效。听起来这适用于此。所以这纯粹是一个风格问题。非本地控制转移可能更难以考虑,但它可能也意味着更短的代码。我将根据这是什么语言以及已经设计了多少现有代码来做出决定。如果您已经拥有异常安全的清理代码,请继续使用它们。

答案 1 :(得分:0)

我不会在其文字定义中使用“异常”。您可以选择的是将取消捕获为用户驱动的值,也许是布尔值,表示用户已取消操作,并使用此布尔值不执行详尽的错误条件检查。

答案 2 :(得分:0)

这取决于您使用的语言。 例如,它是一种常见的做法,它抛出异常并捕获它以中断例如在一个对象内调用的循环或递归,它不足以跳转到父函数。 考虑这个例子:

<?php
class hideAndSeekWithOnlyOneOtherPlayer {
    public function seek() {
        foreach($rooms as $room) {
            if($this->checkRoom($room)) {
                $this->shoutThatIFoundYou();
                return;
            }
        }
        $this->shoutThatICantFindYou();
    }
    function checkRoom($room) {
        $hideouts = $this->getPossibleHideoutsForRoom($room);
        return $this->checkHideouts($hideouts);
    }
    function checkHideouts($hideouts) {
        foreach($hideouts as $hideout) {
            return $this->checkHideout($hideout);

        }
        return false;
    }
    function checkHideout($hideout) {
        $this->walkToHideout();
        return $this->seeIfPersonIsInsideHideout();
    }
}
?>

总是将布尔值从一个函数传递给另一个函数很烦人,相反,你可以在seeIfPersonIsInsideHideout()中抛出一个优先级,而根本不关心返回值! maby这是一个不好的例子,因为当你有多个可能出现的情况时它真的很重要。然后你必须低音回到你在案例陈述等中检查的常量或字符串或整数。 那么定义你自己的异常类会好得多(更容易编码和不正确,错误的可能性更小)!