Exeption vs False

Alkinoy

Начинающий
Exeption vs False

Народ. Есть 2 варианта сигнализировать об ошибке при выполнении метода - вернуть false или вызвать исключение.
Подскажите - в чем прелесть исключений? Чего то я недопонимаю.... Если не затруднит - на конкретном примере.
 

itprog

Cruftsman
Alkinoy
а что , метод не может просто так (т.е. не из-за ошибки) вернуть false ?
 

romy4

invoke [brain]
Используй и то и другое, в зависимости от того, на сколько значима ошибка.

Если твой класс $class->fileopen("file") не находит файла, то это эксепшн, если $class->find_str_pos("bla") то здесь лучше false.
 

fixxxer

К.О.
Партнер клуба
самое очевидное преимущество - с исключениями не нужно после каждой операции делать проверку.
то есть вместо
PHP:
$error = false;
do {
    if (false === op1()) { $error = 'op1 error'; break; }
    if (false === op2()) { $error = 'op2 error'; break; }
    if (false === op3()) { $error = 'op3 error'; break; }
    if (false === op4()) { $error = 'op4 error'; break; }
} while(false);
if ($error !== false) show_error($error);
получаем куда более простой код

PHP:
try {
   op1();
   op2();
   ...
} catch (Exception $e) {
   show_error($e->message());
}
менее очевидное, но более значительное преимущество в том, что exception можно кидать из любого уровня вложенности вызовов.
 

StUV

Rotaredom
менее очевидное, но более значительное преимущество в том, что exception можно кидать из любого уровня вложенности вызовов
+
на "return false"
rethrow не очень красиво получается (придется работать с глобальным массивом кодов ошибок)

+
конструкции вида
try
{...}
catch (Some_Exception $e) {}
catch (Some_Other_Exception $e) {}
 

romy4

invoke [brain]
в добавление к fixxxer, эксепшн можно передавать дальше по цепочке или конкретизировать. допустим, есть
Код:
class ExpFile extends Exception;
class ExpFileRead extends ExpFile;
то таким образом можно ловить ошибки разного уровня..
здесь в блоке do{..} делаем несколько попыток прочтения файла
Код:
try{
//..
  $tries = 3;
  do
  {
     try
     {
      //...
      $f->read(1024);
      //...
     }
     catch(ExpFileRead $e)
     {
      // тут только ошибка чтения
        $tries--;
     }
   }
   while($tries && !$f->eof());
   //...
}
catch(ExpFile)
{
// тут вобще необработанные ошибки для файлов
}
 
Сверху