我见过像以下例外的实现:
<?php
class TestE extends Exception {}
class MyTest {
public function __construct() {
try{
throw new TestE('This is an exception!');
}catch(Exception $exc){
var_dump($exc);
}
echo '2';
}
}
$o = new MyTest();
定义了TestE
之类的自定义异常类,但保持为空,如上所述。它的目的是什么?我可以很容易地使用:
throw new Exception('This is an exception')
而不是
throw new TestE('This is an exception')
答案 0 :(得分:1)
异常的名称会记录到日志文件/ rsyslog等。此外,您的框架可能有异常处理程序,通过检查抛出的异常的类名来处理特定类型的异常。
答案 1 :(得分:1)
这是一个比普通Exception
更具体的错误。
您只能捕获该异常或其整个分支。
class PostException extends Exception {}
class LimitExceededOnPostException extends PostException {}
// When you need to catch any post-related exception...
try {
} catch (PostException $e) {
}
// When you need to catch exactly the `LimitExceededOnPostException`...
try {
} catch (LimitExceededOnPostException $e) {
// do some related things
}
另请注意LogicException
和RuntimeException
之间的区别。一般来说,你不应该扩展Exception
,扩展其中一个。
答案 2 :(得分:0)
扩展Exception
类很有用,因为它允许更好地控制异常处理。
您发布的课程可以像这样使用:
try {
// Some code that can throw Exception, InvalidArgumentException or TestE
// depending on the specific issue it encountered
} catch (TestE $e) {
// TestE is thrown when a specific issue happens; it requires particular handling
// f.e. it can be logged and ignored because the program can continue
} catch (InvalidArgumentException $e) {
// This exception usually signals a coding error;
// for example, an invalid type of an argument passed to a function
// It needs a different handling than TestE; f.e. it can be logged
// and a notification email sent to the developer
} catch (Exception $e) {
// This is the most generic exception type
// It catches all the exceptions that were not caught by the other branches
// A specific handling is not possible for them; log them and exit the program
}
另一方面,类Exception
包含您使用它们所需的所有成员和方法。通常不需要添加更多成员和方法。
这就是扩展Exception
类的原因,但子类没有提供任何新功能(大部分时间)。