如何最好地处理构造函数中的异常?

时间:2010-09-05 13:13:54

标签: php exception exception-handling

如何在构造中以最佳方式处理异常?

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或其他更好的解决方案。

由于

2 个答案:

答案 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);