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

  • Автор темы Автор темы zuxel
  • Дата начала Дата начала

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, но не всегда надо обрабатывать ошибку, иногда можно просто пропустить обработку, если данные не были получены.

Как думаете, как лучше сделать?
 
Ну то есть вместо try{}catch(){}catch{} вам больше нравится switch(){case ..; break;case ..; break;} ?
На мой взгляд второй вариант плох, как минимум велосипедностью.
 
Я же написал, что если писать каждый раз как в примере, то лучше уже catch, но в этом и плюс, что можно иногда опустить обработку ошибку, тогда как с исключениями выбора не остается.
 
zuxel
не очень понял, можно пример?
Ну и какой бы там пример не был, абсолютно все возможные исключения можно отловить так:
catch(\Exception $e){}
 
Например так:
PHP:
if (false !== ($r = $api->call('user.get'))) {
// obtained data proccessing here
}
// flow is running
т.е. если данные получили то обрабатываем их, если нет, то просто код дальше выполняется
Еще подумал, что можно выбрасывать исключения на события, без которых дальнейшая работа с апи невозможна, например если не был получен токен для авторизации, а рутинные операции сделать как выше.

Ну и какой бы там пример не был, абсолютно все возможные исключения можно отловить так:
catch(\Exception $e){}
это да, такой вариант тоже пытаюсь оценить
 
Мне кажется правильно на все варианты ошибок создать исключение, то есть AuthException, BadRequestException и тд, ну и их уже обрабатывать. Еще в 5.5 добавили finally, чтобы в том или ином случае что-то сделать
 
zuxel чтобы опустить ошибку, достаточно во фронт-контроллере сделать catch, который выдаст ошибку 500.
 
но не всегда надо обрабатывать ошибку, иногда можно просто пропустить обработку,
сделать исключения отключаемой опцией

PHP:
$api->throwExceptions = FALSE;
if (false !== ($r = $api->call('user.get'))) {
// obtained data proccessing here
}
// flow is running
 
сделать исключения отключаемой опцией

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