Вікі-код для 5. Обробка помилок
Остання зміна 2024/05/17 19:03 автором Ashterix
Показати останніх авторів
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{box cssClass="floatinginfobox" title="**Зміст**"}} | ||
| 2 | {{toc/}} | ||
| 3 | {{/box}} | ||
| 4 | |||
| 5 | = Формат помилок в RPC = | ||
| 6 | |||
| 7 | {{info}} | ||
| 8 | Відповідно до специфікації JSON-RPC, коли виклик RPC призводить до помилки, об'єкт відповіді повинен містити елемент "error", який є об'єктом з наступними членами: | ||
| 9 | |||
| 10 | - **code**: Число, яке вказує на тип помилки, що виникла. Це має бути ціле число. | ||
| 11 | - **message**: Рядок, що надає короткий опис помилки. Повідомлення має бути коротким і лаконічним. | ||
| 12 | - **data** (необов'язковий): Додаткова інформація про помилку, яка може бути корисною для налагодження. | ||
| 13 | |||
| 14 | Докладніше про формат помилок можна прочитати у специфікації JSON-RPC: [[JSON-RPC 2.0 Specification>>https://www.jsonrpc.org/specification#error_object]]. | ||
| 15 | {{/info}} | ||
| 16 | |||
| 17 | = Обробка помилок = | ||
| 18 | |||
| 19 | У JsonRpcBundle реалізовано стандартний механізм обробки помилок для RPC запитів, який базується на окремому пакеті `ufo-tech/rpc-exceptions`. Цей пакет надає можливість детально обробляти помилки, що виникають під час виконання RPC запитів, і повертати стандартизовані коди та повідомлення про помилки. | ||
| 20 | |||
| 21 | == Коди помилок та їх інтерпретація == | ||
| 22 | |||
| 23 | Пакет `ufo-tech/rpc-exceptions` надає перелік стандартних кодів помилок та відповідних класів виключень: | ||
| 24 | |||
| 25 | |= Код |= Тип помилки |= Опис |= | ||
| 26 | | -32700 | Parse error | Сервер отримав недійсний JSON | | ||
| 27 | | -32600 | Invalid Request | Наданий JSON не є дійсним об'єктом запиту | | ||
| 28 | | -32601 | Method not found | Метод не існує або недоступний | | ||
| 29 | | -32602 | Invalid params | Недійсні параметри методу | | ||
| 30 | | -32603 | Internal error | Внутрішня помилка JSON-RPC | | ||
| 31 | | -32500 | Application error | Помилка виконання процедури | | ||
| 32 | | -32400 | System error | Логічна помилка в додатку | | ||
| 33 | | -32401 | Security error | Токен не знайдено | | ||
| 34 | | -32403 | Security error | Недійсний токен | | ||
| 35 | | -32300 | Async error | Помилка передачі асинхронних даних | | ||
| 36 | | -32301 | Batch error | Помилка batch-запиту | | ||
| 37 | | -32000 | Server error | Зарезервовано для серверних помилок, визначених реалізацією | | ||
| 38 | | від -32001 до -32099 | Користувацька помилка| --- --| | ||
| 39 | |||
| 40 | == Використання виключень у вашому коді == | ||
| 41 | |||
| 42 | {{code language="php" layout="LINENUMBERS" title="=== Отримання об'єкта виключення з коду ==="}} | ||
| 43 | <?php | ||
| 44 | use Ufo\RpcError\AbstractRpcErrorException; | ||
| 45 | |||
| 46 | $code = -32700; | ||
| 47 | $message = 'Some custom error message from rpc server'; // опціонально | ||
| 48 | $rpcException = AbstractRpcErrorException::fromCode($code); | ||
| 49 | // повертає екземпляр RpcJsonParseException::class | ||
| 50 | {{/code}} | ||
| 51 | |||
| 52 | {{code language="php" layout="LINENUMBERS" title="=== Отримання об'єкта виключення з масиву ==="}} | ||
| 53 | <?php | ||
| 54 | use Ufo\RpcError\AbstractRpcErrorException; | ||
| 55 | |||
| 56 | $data = [ | ||
| 57 | 'code' => -32600, | ||
| 58 | 'message' => 'Some custom error message from rpc server', | ||
| 59 | ]; | ||
| 60 | $rpcException = RpcBadRequestException::fromArray($data); | ||
| 61 | // повертає екземпляр RpcBadRequestException::class | ||
| 62 | {{/code}} | ||
| 63 | |||
| 64 | {{code language="php" layout="LINENUMBERS" title="=== Отримання об'єкта виключення з JSON ==="}} | ||
| 65 | <?php | ||
| 66 | use Ufo\RpcError\AbstractRpcErrorException; | ||
| 67 | |||
| 68 | $data = "{\"code\":-32500,\"message\":\"Some custom error message from rpc server\"}"; | ||
| 69 | $rpcException = AbstractRpcErrorException::fromJson($data); | ||
| 70 | // повертає екземпляр RpcRuntimeException::class | ||
| 71 | {{/code}} | ||
| 72 | |||
| 73 | == Поради для розробників == | ||
| 74 | |||
| 75 | Якщо ви, як розробник, хочете повертати специфічну помилку, яка буде інтерпретована RPC сервером, вам слід використовувати один з інтерфейсів, наданих пакетом `ufo-tech/rpc-exceptions`, або наслідувати типовий ексепшен та притримуватися нумерації помилок. | ||
| 76 | |||
| 77 | Однак, якщо специфічна обробка не потрібна, сервер здатний обробити будь-яку помилку або виключення, що відбуваються на рівні виконання методу API, забезпечуючи стабільність та надійність вашої системи. |