我不明白如何使用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) ?
}
}
答案 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
捕获,您可以为抛出的异常提供自己的逻辑。