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

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

option1 – исключение catch, где созданный объект:

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 : исключение catch внутри __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 или другое лучшее решение.

благодаря

Solutions Collecting From Web of "Как лучше обрабатывать исключения в конструкторе?"

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

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

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