Как лучше обрабатывать исключения в конструкторе? - PullRequest
4 голосов
/ 05 сентября 2010

Как лучше всего обработать исключение в конструкции?

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) {

    }
}

Пожалуйста, напишите, в каких случаях следует использовать вариант 1, а в каких следует использовать вариант 2 или другое лучшее решение.

Спасибо

Ответы [ 2 ]

7 голосов
/ 05 сентября 2010

Какова цель выбросить исключение и немедленно его поймать? Если вы хотите прервать функцию при ошибке, но не выдать ошибку, вам следует return.

Таким образом, ваш первый код всегда верен. Пусть возникнет Исключение.

6 голосов
/ 05 сентября 2010

Конечно, вы должны обработать исключение, генерируемое в функции вне этой функции, иначе это не будет иметь никакого смысла. Что касается конструкторов, постарайтесь по возможности избегать «нового имени класса» и вместо этого придерживаться функций генератора. Для каждого класса 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...