【问题标题】:How to catch the "Call to undefined method" error in PHP 7?如何捕获 PHP 7 中的“调用未定义方法”错误?
【发布时间】:2016-09-22 00:51:40
【问题描述】:

我使用自己的简单错误处理,实际上可以捕获并记录我需要的所有内容。但现在我需要用try{}catch(){} 捕捉错误。我预计有时会在那个地方发生的错误是“调用未定义的方法”错误。我可以这样捕捉它:

try {
    $someObject->someMethodTheObjectDoesntProvide();
} catch (Error $e) {
    // do something else
}

但是catch 子句中的Error 类有点通用。我只想捕获这种类型的错误。

有没有办法将捕捉到特定“类型”的错误?

不使用strpos($errorMessage)... ;)

【问题讨论】:

  • 不,只有不同的错误/异常类;这只是一个通用的Error
  • 我不确定__call() 是否会拦截对不存在的方法(或仅对不可访问的方法)的调用,并允许您抛出一个自定义异常,然后可以捕获并处理该异常与其他错误不同
  • 您可能想要捕获发生的任何错误,而不仅仅是一个特定的错误。但是您可以根据抛出的错误类型在 catch 块中采取特定操作
  • 在你的类中使用一个神奇的 __call() 方法可用于在方法不存在时抛出自定义异常 - Demo

标签: php error-handling exception-handling try-catch php-7


【解决方案1】:

在您的类中使用神奇的__call() 方法可用于在方法不存在时引发自定义异常

class myCustomException extends Exception {
}

class someClass {
    public function __call($name, $arguments) {
        if (!method_exists($this, $name)) {
            throw new myCustomException($name . ' has shuffled the mortal coil');
        }
    }
}


$someObject = new someClass();
try {
    $someObject->someMethodTheObjectDoesntProvide();
} catch (myCustomException $e) {
    echo $e->getMessage();
}

Demo

【讨论】:

  • 非常感谢您的回答和演示!不幸的是,它并没有解决问题,因为它有一个非常不方便的限制:使用这种方法假定方法someMethodTheObjectDoesntProvide() 的类SomeClass 必须实现类似HasCallMagicMethod 接口的东西。非内置异常和错误是正常的,但Notice 是内置异常和错误,应该在没有在“抛出”类中实现任何特殊的情况下被捕获。但是,该问题无法以其他方式(目前)解决,您的建议是一个很好的解决方法。再次感谢您!
【解决方案2】:

我知道我已经晚了 18 个月,但您是否考虑过按照 @Mark Baker 的建议去做,而是抛出 BadMethodCallException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2018-04-04
    • 2021-06-21
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多