Как правильно обрабатывать ошибки и исключения?
Если я правильно понял функционалclass AppException extends Exception {}

class Test{
  public function create(array $data){
    if(empty($data['message'])){
      throw new AppException('Сообщение не может быть пустым');
    }
  }
}

$test = new Test();

try{
  $test->create(array('message' => 'v'));
  // redirect
}catch(AppException $e){
  echo $e->getMessage();
}
Идея в том, что при использовании исключений, никаких ручных проверок делать не надо. Если исключения не было - значит всё нормально. А если было, то код попросту не будет исполнен.
Стоит разделять публичные и приватные исключения. Пользователям не стоит видеть внутреннюю кухню. Так что:class HttpExcepton extends RuntimeException {}
class ExampleHttpException extends HttpExcepton {}

//

throw new ExampleHttpException('Сообщение не может быть пустым', 422);
Так что всё это дело можно свести к одному единственному try/catch, который будет выводить текст из всех HttpExcepton (и статус код, например, в данном примере 422), и выводить сообщения "Internal Server Error" от любых других.