Винятки

Zephir реалізує винятки на дуже низькому рівні, забезпечуючи схожу поведінку і функціональність як у PHP.

Коли генерується виняток, блок catch може бути використаний для перехоплення виключення і надання розробнику можливості забезпечити належну обробку:

Винятки можуть бути викинуті всередині блоку try. Обробка виконується в блоці catch, як і в PHP:

var e;
try {

    throw new \Exception("This is an exception");

} catch \Exception, e {

    echo e->getMessage();
}

Zephir також забезпечує “тихий” блок try, який просто ігнорує будь-які винятки всередині цього блоку:

try {
    throw new \Exception("This is an exception");
}

Якщо вам не потрібна змінна виключення в блоці catch, ви можете не вказувати її:

try {

    throw new \Exception("This is an exception");

} catch \Exception {

    echo "An exception occur!";
}

Один блок catch може використовуватися для перехоплення декількох типів винятків:

var e;
try {

    throw new \Exception("This is an exception");

} catch \RuntimeException|\Exception, e {

    echo e->getMessage();
}

Zephir дозволяє викидати літерали або статичнотипізовані змінні так, ніби вони є повідомленням про виняток:

// throw new \Exception("Test");
throw "Test";

// throw new \Exception((string) 't');
throw 't';

// throw new \Exception((string) 123);
throw 123;

// throw new \Exception((string) 123.123);
throw 123.123;

Винятки в Zephir надають ті самі методи, що й методи в PHP, для того, щоб дізнатися де сталася помилка. Тобто, Exception::getFile() та Exception::getLine() повертають ім’я файлу та номер рядка де в Zephir-коді був згенерований виняток:

Exception: The static method 'someMethod' does not exist on model 'Robots'
File=phalcon/mvc/model.zep Line=4042
#0 /home/scott/test.php(64): Phalcon\Mvc\Model::__callStatic('someMethod', Array)
#1 /home/scott/test.php(64): Robots::someMethod()
#2 {main}