如何在构造中以最佳方式处理异常?
option1 - 捕获创建对象的异常:
class Account {
function __construct($id){
if(empty($id)){
throw new My_Exception('id can\'t be empty');
}
// ...
}
}
class a1 {
function just($id){
try {
$account = new Account($id);
}
catch(Exception $e){
$e->getMessage();
}
}
class a2{
function just($id){
try {
$account = new Account($id);
}
catch(Exception $e){
$e->getMessage();
}
}
option2 :在__construct
中捕获异常class Account{
function __construct($id){
try{
if(empty($id)){
throw new My_Exception('id can\'t be empty');
}
// ...
}
catch(My_Exception $e) {
}
}
请写下哪些情况应该使用option1,其中应该使用option2或其他更好的解决方案。
由于
答案 0 :(得分:7)
抛出异常并立即捕获它的目的是什么?如果要在出错时中止函数但不抛出错误,则应return
。
因此,您的第一个代码始终是正确的。让异常泡沫起来。
答案 1 :(得分:6)
当然,你应该处理在这个函数之外的函数中抛出的异常,否则它将没有任何意义。关于构造函数,尽量避免使用“新类名”,而是坚持使用生成器函数。对于每个类X,确定哪个类负责创建类X的对象,并向该类添加生成器函数。这个生成器函数也是处理X的构造函数异常的理想场所
class AccountManager {
function newAccount($id) {
try {
$obj = new Account($id);
} catch....
return null;
}
}
// all other code uses this instead of "new Account"
$account = $accountManager->newAccount($id);