1. Допустим, самый банальный вариант:
class db
{
// …
public function sql_query($query)
{
$this->result = mysql_query($query)
or $this->error(mysql_error().' in query '.$query);
return $this->result;
}
private function error($message)
{
throw new dbException($message);
}
}
Но, sql-запрос — это довольно часто нужная операция, и мне кажется логичней будет не каждый раз обрамлять код с запросом в try-catch, а сделать примерно так:
// начало программы, подключение классов, конфигов и т. д.
try {
// а тут мы подключаем модули. конечно, они у меня не так подключаются, это для примера
if (file_exists("includes/".$_GET['module']."/.inc.php"))
include("includes/".$_GET['module']."/.inc.php")
} catch (dbException $e) {
// обрабатываем
}
То есть практически весь код загнать в один большой блок try-catch. Я правильно мыслю?
Тогда второй вопрос.
2. Зачем нужно наследовать от Exception, понятно — чтобы знать, какую именно ошибку отлавливаешь. Так? Какие еще есть выгоды от этого?
3. Допустим, у меня есть кусок кода, который потенциально может породить два типа ошибок. Как их отлавливать?
try {
try {
// этот ужасный кусок кода
} catch (secondException $e2) {
// обрабатываем
}
} catch (firstException $e1) {
// обрабатываем
}
Так? Или есть более элегантный способ?)
4. И последнее. Я сейчас использую свой шаблонизатор, основаный на нативных шаблонах. Выглядит это дело примерно так:
$stemp = new STemp();
// В index.tpl.php у нас основа, изменяюмую часть подключаем так:
$stemp->assign("page", "news");
$stemp->display("index.tpl.php");
А в index.tpl.php:
<html><head></head><body>
<?php require_once($this->path.$this->page.".tpl.php") ?>
</body></html>
Было бы логично $stemp->display(); расположить в блоке try и отлавливать ошибку, если например, переменная $page не передана в шаблон. Но тогда в шаблоне придется писать:
<html><head></head><body>
<?php if(!file_exists($this->path.$this->page.".tpl.php")) throw new STempException('Fuck! Template not found.');
require_once($this->path.$this->page.".tpl.php") ?>
</body></html>
А это, на мой взгяд, уже нарушение самой сути MVC. Какой, нафиг, file_exists в шаблоне? И тем более throw. Как тут быть?