使用PHP返回有用的错误消息

时间:2016-05-31 18:57:23

标签: php

我不明白如何使用PHP正确创建和返回有用的错误消息到网上。

我有一个班级

class Foo {
    const OK_IT_WORKED = 0;
    const ERR_IT_FAILED = 1;
    const ERR_IT_TIMED_OUT = 3;

    public function fooItUp(){
        if(itFooed)
          return OK_IT_WORKED;
        elseif(itFooedUp)
          return ERR_IT_FAILED;
        elseif(itFooedOut)
          return ERR_IT_TIMED_OUT;
    }
}

另一个使用此类执行有用操作的类,然后将结果返回给用户。我只是想知道我把所有错误消息的字符串值放在哪里。

class Bar {
    public function doFooeyThings(stuff){
        $res = $myFoo->fooItUp();
        // now i need to tell the user what happened, but they don't understand error codes
        if($res === Foo::OK_IT_WORKED)
           return 'string result here? seems wrong';
        elseif ($res === Foo::ERR_IT_FAILED)
           return Foo::ERR_IT_FAILED_STRING; // seems redundant?
        elseif($res === Foo:ERR_IT_TIMED_OUT)
           return $res; // return number and have an "enum" in the client (js) ?
    }

}

2 个答案:

答案 0 :(得分:2)

应尽可能避免返回错误状态。请改用异常。如果您在阅读有关here

之前从未使用过例

您可以通过多种方式在示例中使用异常。您可以为每个错误或每个错误类别创建自定义例外。有关自定义异常here的更多信息,或者您可以创建默认Exception类的实例,并将错误消息作为字符串提供给它。

以下代码遵循第二种方法:

class Foo {
    const OK_IT_WORKED = 0;
    const ERR_IT_FAILED = 1;
    const ERR_IT_TIMED_OUT = 3;

    public function fooItUp(){
        if(itFooed)
          return OK_IT_WORKED;
        else if(itFooedUp)
           throw new Exception("It failed")
        else if(itFooedOut)
           throw new Exception("Request timed out");
    }
}

我确信你能想到比我用过的更优雅的信息。无论如何,您可以继续使用try / catch块在调用方法上处理这些异常:

class Bar {
    public function doFooeyThings(stuff){
        try
        {
           $res = myFoo->fooItUp();
        }
        catch(Exception $e)
        {
           //do something with the error message
        }

    }

}

fooItUp抛出的任何异常都将被捕获"通过catch块并由您的代码处理。

您还应该考虑两件事:

  • 最好不要向用户显示有关错误的详细信息,因为恶意用户可能会使用这些信息

  • 理想情况下,您应该进行某种全局异常处理

答案 1 :(得分:1)

一种解决方案是将例外与set_exception_handler()结合使用。

<?php

set_exception_handler(function($e) {
    echo "Error encountered: {$e->getMessage()}";
});

class ErrorMessageTest
{
    public function isOk()
    {
        echo "This works okay. ";
    }

    public function isNotOkay()
    {
        echo "This will not work. ";
        throw new RuntimeException("Violets are red, roses are blue!! Wha!?!?");
    }
}

$test = new ErrorMessageTest();

$test->isOk();
$test->isNotOkay();

set_exception_handler()方法采用可接受异常作为参数的可调用方法。如果它没有被try/catch捕获,您可以为抛出的异常提供自己的逻辑。

Live Demo

另请参阅:set_exception_handler() documentation