我试图覆盖getMessage()
以给返回消息一个默认值,但失败了,因为PHP Exception
类中的所有方法都是最终的。
现在我只是好奇它为什么。我知道我可以通过添加代理方法来解决这个问题。
答案 0 :(得分:3)
他们是final
,以确保它们在所有继承的class
es中以完全相同的方式工作。程序员希望getMessage
以完全相同的方式为class
直接或传递的所有Exception
es工作。您可以在构造函数中设置消息,因为您可以为您的类编写自己的构造函数。
答案 1 :(得分:1)
我的印象是你需要这样的模式:
<?php
class UserNotFoundException extends \RuntimeException {
const MESSAGE_TEMPLATE = 'Could not find the requested user: %s';
public static function fromId($user_id) {
$message = sprintf(self::MESSAGE_TEMPLATE, "ID=$user_id");
return new self($message);
}
public static function fromName($name) {
$message = sprintf(self::MESSAGE_TEMPLATE, "name=$name");
return new self($message);
}
}
try {
throw UserNotFoundException::fromId(314);
} catch (RuntimeException $e) {
echo $e->getMessage() . PHP_EOL;
}
try {
throw UserNotFoundException::fromName('john');
} catch (RuntimeException $e) {
echo $e->getMessage() . PHP_EOL;
}
Could not find the requested user: ID=314
Could not find the requested user: name=john
根据您的确切需要调整它。这对于重用非常实用,并且不会有干扰整体异常机制的风险。
答案 2 :(得分:-2)
编写自己的例外。
class MyException extends \Exception
{
}