rest api, обработка ошибок

zuxel

Новичок
Разрабатываю api для сайта, параллельно пишу клиента для этого api. Пытаюсь решить вопрос как лучше сделать обработку ошибок, видел, что часто активно используется обработка исключений, но мне в этом способе не нравится необходимость каждый запрос оборачивать двойными, а то и тройными catch.

Я склоняюсь к такой схеме: запрос к api возвращает только данные(результат запроса) или false (false обозначает только ошибку, а пустой результат - это пустой массив), все исключения отлавливаются библиотекой, но при необходимости пользователь может получить ошибку(если она была) опросив переменную класса, т.е. как-то так:

PHP:
if (false === ($r = $api->call('user.get'))) { // empty result of user.get is an empty array, so FALSE means an error
	switch ($api->getError()->getCode()){
		case 'CODE_1':
		break;
		.............
	}
	
	return false;
}

// obtained data proccessing here
Понятно, что такой код обработки не лучше чем каждый раз обертывать в catch, но не всегда надо обрабатывать ошибку, иногда можно просто пропустить обработку, если данные не были получены.

Как думаете, как лучше сделать?
 

hell0w0rd

Продвинутый новичок
Ну то есть вместо try{}catch(){}catch{} вам больше нравится switch(){case ..; break;case ..; break;} ?
На мой взгляд второй вариант плох, как минимум велосипедностью.
 

zuxel

Новичок
Я же написал, что если писать каждый раз как в примере, то лучше уже catch, но в этом и плюс, что можно иногда опустить обработку ошибку, тогда как с исключениями выбора не остается.
 

hell0w0rd

Продвинутый новичок
zuxel
не очень понял, можно пример?
Ну и какой бы там пример не был, абсолютно все возможные исключения можно отловить так:
catch(\Exception $e){}
 

zuxel

Новичок
Например так:
PHP:
if (false !== ($r = $api->call('user.get'))) {
// obtained data proccessing here
}
// flow is running
т.е. если данные получили то обрабатываем их, если нет, то просто код дальше выполняется
Еще подумал, что можно выбрасывать исключения на события, без которых дальнейшая работа с апи невозможна, например если не был получен токен для авторизации, а рутинные операции сделать как выше.

Ну и какой бы там пример не был, абсолютно все возможные исключения можно отловить так:
catch(\Exception $e){}
это да, такой вариант тоже пытаюсь оценить
 

hell0w0rd

Продвинутый новичок
Мне кажется правильно на все варианты ошибок создать исключение, то есть AuthException, BadRequestException и тд, ну и их уже обрабатывать. Еще в 5.5 добавили finally, чтобы в том или ином случае что-то сделать
 

Absinthe

жожо
zuxel чтобы опустить ошибку, достаточно во фронт-контроллере сделать catch, который выдаст ошибку 500.
 

A1x

Новичок
но не всегда надо обрабатывать ошибку, иногда можно просто пропустить обработку,
сделать исключения отключаемой опцией

PHP:
$api->throwExceptions = FALSE;
if (false !== ($r = $api->call('user.get'))) {
// obtained data proccessing here
}
// flow is running
 

zuxel

Новичок
сделать исключения отключаемой опцией

PHP:
$api->throwExceptions = FALSE;
if (false !== ($r = $api->call('user.get'))) {
// obtained data proccessing here
}
// flow is running
примерно так и сделал, добавил флаг, в соответствии с которым или бросается исключение или возвращается false(по-умолчанию)
 
Сверху