2010-09-05 3 views
3

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

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 или другое лучшее решение.

Благодаря

+1

Я не голосуя, чтобы закрыть, потому что я не уверен, что все детали вашего конкретного вопроса, но здесь очень тесно связан один: HTTP : //stackoverflow.com/questions/2685857/php-exceptions-in-classes (мне лично нравится альтернативный метод @Gordon представляет в своем ответе использование ':: create()' best) –

+0

спасибо отличная ссылка! – Yosef

ответ

6

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

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

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

+0

Вы не можете «возвращать» конструктор в PHP. – DavidScherer

+0

@DavidScherer Вы можете вернуться, просто не возвращайте значение ('return;'). – NikiC

+0

Я знаю, что вы можете вернуться, но возврат значения ничего не делает (если вы не вызываете конструктор напрямую, что позволяет PHP, что поощряло плохое программирование). Я ошибочно прочитал ваш ответ, рекомендуя вернуть ошибку, а не бросать ее. – DavidScherer