首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我要在php中使用异常处理?

为什么我要在php中使用异常处理?
EN

Stack Overflow用户
提问于 2011-06-30 13:14:10
回答 8查看 3.2K关注 0票数 8

我已经编写PHP很长一段时间了,但不太喜欢PHP5……我知道PHP 5中的异常处理已经有一段时间了,但我从来没有真正研究过它。在快速搜索之后,使用异常处理似乎毫无意义-我看不出使用它比使用一些if() {}语句,或者我自己的错误处理类或其他什么使用它有什么好处。

使用它肯定有一堆很好的理由(我猜?!)否则它就不会被放入语言中(很可能)。有没有人能告诉我,与使用一堆if语句或switch语句或其他语句相比,它有什么好处?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-06-30 13:28:51

异常允许您区分不同类型的错误,并且对于路由也很有用。例如..。

代码语言:javascript
运行
复制
class Application
{
    public function run()
    {
        try {
            // Start her up!!
        } catch (Exception $e) {
            // If Ajax request, send back status and message
            if ($this->getRequest()->isAjax()) {
                return Application_Json::encode(array(
                    'status' => 'error',
                    'msg'    => $e->getMessage());
            }

            // ...otherwise, just throw error
            throw $e;
        }
    }
}

然后,引发的异常可以由自定义错误处理程序处理。

由于PHP是一种松散类型的语言,您可能需要确保只将字符串作为参数传递给类方法。例如..。

代码语言:javascript
运行
复制
class StringsOnly
{
    public function onlyPassStringToThisMethod($string)
    {
        if (!is_string($string)) {
            throw new InvalidArgumentException('$string is definitely not a string');
        }

        // Cool string manipulation...

        return $this;
    }
}

如果您需要以不同的方式处理不同类型的异常,请使用...or。

代码语言:javascript
运行
复制
class DifferentExceptionsForDifferentFolks
{
    public function catchMeIfYouCan()
    {
        try {
            $this->flyForFree();
        } catch (CantFlyForFreeException $e) {
            $this->alertAuthorities();
            return 'Sorry, you can\'t fly for free dude. It just don\'t work that way!';
        } catch (DbException $e) {
            // Get DB debug info
            $this->logDbDebugInfo();
            return 'Could not access database. What did you mess up this time?';
        } catch (Exception $e) {
            $this->logMiscException($e);
            return 'I catch all exceptions for which you did not account!';
        }
    }
}

如果在类似Zend Framework的东西中使用事务:

代码语言:javascript
运行
复制
class CreditCardController extends Zend_Controller_Action
{
    public function buyforgirlfriendAction()
    {
        try {
            $this->getDb()->beginTransaction();

            $this->insertGift($giftName, $giftPrice, $giftWowFactor);

            $this->getDb()->commit();
        } catch (Exception $e) {
            // Error encountered, rollback changes
            $this->getDb()->rollBack();

            // Re-throw exception, allow ErrorController forward
            throw $e;
        }
    }
}
票数 6
EN

Stack Overflow用户

发布于 2011-06-30 13:29:00

Exception handling: If condition versus Exception并不是专门针对PHP的,但它提供了一个很好的视角。就我个人而言,Exception(s) & try/catch是用语言实现的,目的是在开发人员中强制执行良好的行为,而这些行为通常不会像错误检查/处理那样用心。

如果你确信你的if/else if/else能捕捉到所有的场景,那就太酷了。

下面是Advantages of Exceptions - Java的概述--其中有一段代码,其中包含许多if/else语句和以下摘录:

这里有如此多的错误检测、报告和返回,以至于最初的7行代码在混乱中丢失了。更糟糕的是,代码的逻辑流也丢失了,因此很难判断代码是否在做正确的事情:如果函数没有分配足够的内存,文件真的会被关闭吗?当您在编写方法三个月后修改方法时,要确保代码继续执行正确的操作就更加困难了。许多程序员通过简单地忽略它来解决这个问题-当他们的程序崩溃时会报告错误。

所以真的,归根结底是个人偏好。如果你想要代码是可读的,并且可以被其他人使用,这通常是一种更好的方法,并强制实现最佳行为

票数 3
EN

Stack Overflow用户

发布于 2011-06-30 13:20:51

如果您遵循的是面向对象的方法,那么异常对于错误处理就很方便。通过异常跨对象传递错误是很方便的。如果你使用分层设计方法,异常是非常有用的。

如果你不是以面向对象的方式编码,那么就不需要异常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6530206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档