مدیریت خطاها – Error handling

مقدمه ای بر Error Handling

قبل از هر چیز لازم است بدانیم مدیریت خطا یا error handling به چه معناست. این اصطلاح به واکنش و مکانیسم‌های بازیابی نرم‌افزار در صورت بروز خطا اشاره می‌کند. به عبارت دیگر این کار فرآیندی است که شامل پیش‌بینی دقیق، شناسایی و رفع خطاها در برنامه‌ها است.

اجرای منظم یک برنامه از طریق مدیریت خطا آسان‌تر است. وقتی صحبت از رویکردهای خطا handling می‌شود، بسیاری از برنامه‌ها با مشکلات معماری نرم‌افزار مواجه می‌شوند.

توجه داشته باشید که API AirPlus کامل منطق بر اصول RESTful API نوشته شده است پس بنابراین پاسخ تمام درخواست ها با Status Code مورد نظر خود ارسال خواهد شد و مدیریت این Status Code ها یا هما کدهای وضعیتی در برنامه شما الزامیست.

1681155201571.png

طبق اصول کلی تمام پاسخ های صحیح با کد وضعیتی 200 ارسال خواهند شد.

اما اتوماسیون ایرپلاس در زمینه مدیریت خطاها هم مستندات جامع و کاربردی را تهیه نموده است.

نحوه نگارش خطاها

پاسخ نادرست – Response False یا همان مشکل در ارسال اطلاعات

عنوان نوع مقادیر توضیحات
status Boolean false مقدار در پاسخ نادرست همیشه false است
time Timestamp زمان تولید پاسخ این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود.
code Integer شماره خطا مربوطه جهت استعلام خطا میتوانید از طریق این لینک اقدام کنید.
{
    "status": false,
    "time": "Timestamp", // Timestamp
    "code": "Error Code"
}

Status Code – کدهای وضعیتی درخواست ها

 وضعیت 200 — OK

کد وضعیت 200 OK نشان می‌دهد که درخواست به‌درستی توسط سرور دریافت، درک و پردازش شده و پاسخ استاندارد حاوی داده‌های درخواست‌شده را بازگردانده است.

طبق RFC 9110 (HTTP Semantics, 2022)، این کد برای موفقیت عمومی تمام متدهای HTTP استفاده می‌شود؛ در پاسخ به GET معمولاً به معنی دریافت محتوای صحیح است، در PUT و DELETE به معنی انجام کامل عملیات است.

در صورت دریافت 200، کلاینت می‌تواند فرض کند که هیچ خطایی در فرآیند ارتباط وجود نداشته و پاسخ معتبر است.


 وضعیت 201 — Created

کد 201 Created نشان می‌دهد که درخواست با موفقیت انجام شده و منبع جدیدی ایجاد شده است.

بر اساس RFC 9110، این پاسخ اغلب برای متدهای POST و گاهی PUT استفاده می‌شود. سرور می‌تواند هدر Location را شامل URI منبع تازه ایجادشده برگرداند تا کلاینت بتواند به آن دسترسی پیدا کند.

نمونه: هنگام ثبت سفارش یا خرید بلیت، اگر ایجاد آیتم در پایگاه داده موفقیت‌آمیز باشد، سرور وضعیت 201 بازمی‌گرداند.


 وضعیت 204 — No Content

کد 204 No Content به معنی موفقیت‌آمیز بودن درخواست بدون نیاز به ارسال محتوای جدید در پاسخ است.

این کد معمولاً در پاسخ به متدهای PUT, PATCH, DELETE یا POST استفاده می‌شود، زمانی‌که عمل مورد‌نظر در سرور انجام شده ولی داده‌ای برای بازگرداندن وجود ندارد.

مثال: API حذف رزرو در صورت موفق بودن حذف، بدون بدنهٔ پاسخ، وضعیت 204 ارسال می‌کند.


 وضعیت 207 — Multi‑Status

کد 207 Multi‑Status بخشی از استاندارد WebDAV (RFC 4918) است.

این کد زمانی استفاده می‌شود که یک درخواست شامل چندین عملیات یا منبع باشد و پاسخ برای هر مورد جداگانه در قالب XML یا JSON شامل وضعیت مجزا ارائه گردد.

به‌طور مثال در یک درخواست جمعی برای بروزرسانی چند فایل، اگر بعضی پردازش شوند و بعضی خطا بدهند، پاسخ 207 حاوی نتیجهٔ جزئی هر فایل ارسال می‌شود.


 وضعیت 400 — Bad Request

کد 400 Bad Request نشان‌دهندهٔ آن است که سرور نمی‌تواند یا نمی‌خواهد درخواست را پردازش کند زیرا در نحو (syntax) یا ساختار داده‌های درخواست خطا وجود دارد.

علل رایج: بدنه غیرقابل parse شدن، مقادیر ناقص، هدرهای نادرست یا شناسهٔ توکن نامعتبر.

این خطا ناشی از اشتباه سمت کلاینت است و معمولاً با پیام‌هایی نظیر invalid JSON یا missing parameter همراه می‌شود.


 وضعیت 404 — Not Found

کد 404 Not Found زمانی برگردانده می‌شود که منبع یا مسیر مورد نظر در سرور وجود ندارد یا حذف شده است.

از دید API یعنی Endpoint یا URI درخواستی شناسایی نمی‌شود.

دلایل معمول: آدرس غلط، تغییر نسخهٔ سرویس، پایان پشتیبانی از مسیر قبلی (deprecated endpoint).

راه‌حل: بررسی مجدد URL و در صورت نیاز به‌روزرسانی URI مورد استفاده.


 وضعیت 405 — Method Not Allowed

کد 405 Method Not Allowed یعنی URI مورد درخواست معتبر است، اما متد (مثلاً POST یا DELETE) توسط سرور برای آن مسیر مجاز نیست.

در پاسخ معمولاً هدر Allow شامل لیستی از متدهای مجاز مثل GET, PUT برگردانده می‌شود.

این خطا از نوع کلاینت است و نشانهٔ استفاده از متد غیرفعال برای endpoint خاص می‌باشد.


 وضعیت 409 — Conflict

کد 409 Conflict به معنی وجود تعارض در وضعیت فعلی منبع است که مانع انجام عملیات می‌شود.

این خطا زمانی بازگردانده می‌شود که درخواست در تضاد با داده‌های موجود باشد، مثلاً تلاش برای ایجاد رکورد تکراری یا بروزرسانی نسخهٔ قدیمی شیء.

در سيستم‌های دارای نسخه‌بندی و کنترل همزمان (مثل وب‌سایت رزرو یا فرم ثبت آیتم تکراری) کاربرد دارد.


 وضعیت 422 — Unprocessable Entity

کد 422 Unprocessable Content (نام جدید در RFC 9110، ‌قبلاً Unprocessable Entity در RFC 4918 بود) زمانی ارسال می‌شود که درخواست از نظر نحوی درست است ولی داده‌های آن از نظر منطقی یا اعتبارسنجی نامعتبر است.

مثلاً فیلدهای الزامی خالی‌اند یا مقادیر بعضی پارامترها خارج از محدودهٔ مجاز هستند.

این کد معمولاً در APIهایی که قبل از پردازش داده، validation دقیقی انجام می‌دهند (مثلاً در فرم‌های ثبت اطلاعات) استفاده می‌شود.


 وضعیت 500 — Internal Server Error

کد 500 Internal Server Error بیانگر خطای عمومی در سمت سرور است، بدون اشاره به علت دقیق.

معمولاً در اثر بروز استثنا (Exception)، نقص در پیکربندی، یا قطع ارتباط سرویس وابسته رخ می‌دهد.

این خطا قابل تشخیص برای کلاینت نیست و صرفاً به معنی شکست درخواست در سطح سرور است.

توصیهٔ استاندارد: بررسی log سرور، و در صورت نیاز ارائه سرویس پشتیبان یا fallback endpoint برای حفظ پایداری ارتباط.


خطاهایی که در قالب Response دریافت میشود

این خطا ها در قالب Response False بصورت کد دریافت میشوند که میتوانید در متن خطا ها و راه حل آنها را در جدول زیر مشاهده نمائید.

ردیف کد خطا عنوان راه حل
1 1000 ثبت این آیتم موفقیت آمیز بوده است در مواردی دیگر خطایی رخ داده است.
2 1001 امکان قفل بر روی چارتری درخواستی امکان پذیر نمی باشد. این خطا راهکاری ندارد.
3 1002 چارتر درخواستی موجود نمی باشد. این خطا راهکاری ندارد.
4 1003 مقصد مورد نظر یافت نشد. لطفا مقصد مورد نظر را یا بصورت یاتا و یا بصورت سریال از طریق API ایرپلاس وارد نمائید (الویت سریال های ایرپلاس می باشد)
5 1004 تاریخ های وارد شده معتبر نمی باشد لطفا تاریخ ها را به میلادی و با فرمت صحیح ارسال فرمائید (YYYY-MM-DD)
6 1005 قفل ارسالی معتبر نمی باشد. اطلاعات قفل را بررسی نمائید و اگر از کد اطمینان دارید تعداد مسافرین با قفل همخوانی ندارد.
7 1006 برای این مسافر قبلا این آیتم خریداری شده است. در صورتی که با این خطا مواجه شده اید از طریق متد بررسی وضعیت اطلاعات این رزرو را دریافت نمائید.
8 1007 آیتم مورد نظر یافت نشد. این خطا راهکاری ندارد.
9 1008 ظرفیت این آیتم تکمیل شده است لطفا مجدد جستجو را انجام دهید و در صورت فعال بودن آیتم دیگری را انتخاب نمائید.
10 1009 تعداد مسافرین با قفل ارسالی همخوانی ندارد لطفا مجدد درخواست خود را با تعداد صحیح مندرج در قفل ارسال فرمائید.
11 1010 جمع مبلغ ارسالی با مبلغ قابل پرداخت همخوانی ندارد. لطفا مجدد درخواست خود را با مبلغ صحیح ارسال فرمائید.
12 1011 کد ملی/شماره پاسپورت معتبر نمی باشد لطفا کدملی/شماره پاسپورت موجود در data را بررسی و تصحیح فرمائید.
13 1012 با اطلاعاتی ارسالی رزروی یافت نشد لطفا اطلاعات رابررسی و دوباره اقدام فرمائید.
14 1013 فرمت شماره موبایل ارسالی صحیح نمی باشد. فرمت صحیح شماره تلفن همراه باید با +98 یا 09 و یا 9 شروع شده باشد و تعداد کاراکتر صحیح ارسال شود.
15 1014 فرمت ایمیل ارسالی صحیح نمی باشد. لطفا یک ایمیل صحیح با فرمت درست ارسال فرمائید بطور مثال : info@airplus.app
16 1015 استرداد این آیتم باتوجه به قوانین استرداد امکان پذیر نمی باشد. با توجه به قوانین استرداد این آیتم امکان استرداد را ندارد.
17 1016 مغادیر مورد نیاز API ارسال نشده است. لطفا مغادیر را بررسی فرمائید و مقدار لازم را ارسال فرمائید.
18 1017 مغادیر مورد api به درستی ارسال نشده است. لطفا مغادیر را برسی فرمایید و مقدار لازم را به صورت صحیح و در فرمت مشخص ارسال فرمایید.
19 1018 تاریخ شروع و پایان جستجو فقط میتوانید در آینده باشد. لطفا محدوده تاریخی خود را به آینده تغییر دهید و اعتبارسنجی این موضوع را انجام دهید.
20 1019 ملیت مسافر معتبر نمی باشد. لطفا ملیت مسافر را برسی نمائید و ملیت معتبر را ارسال فرمائید.
21 1021 ورود تاریخ با فرمت صحیح الزامی می باشد. لطفا تاریخ را در فرمت صحیح ارسال فرمائید.
22 2000 خطای مهلک رخ داده است این خطا الزاما باید از طریق هسته مرکزی رفع شود و لطفا به واحد پشتیبانی اطلاع دهید.

در ضمن میتوانید از طریق API زیر بصورت داینامیک این خطاها را دریافت و مدیریت نمائید.

دریافت جزئیات خطا از طریق API

عنوان وضعیت مقادیر توضیحات
Method اجباری GET متد ارسال درخواست
Domain اجباری نام دامنه ثبت شده در اتوماسیون  
Api Url اجباری دامنه هسته مرکزی سرویس  
Api version اجباری به نسخه فعلی سرویس API تلقی میشود که در قسمت پیش نیازهای اتوماسیون به ریز شرح داده شده است.  
Authorization اجباری توکن JWT تولید شده این توکن بصورت JWT تولید میشود.
توضیحات ارسال درخواست

سربرگ – Header

در این روش شما باید درخواست خود را از طریق لینک زیر ارسال فرمائید.

{{Api Url}}/error-handling

HEADER
GET /api/reservation/{{Api version}}/error-handling HTTP/1.1
Host: {{Your Host}}
Authorization: Bearer JWTToken
Content-Type: application/json
Domain: {{Your Domain}}

API Url از طریق پنل کاربری قابل مشاهده خواهد بود

مقادیر ارسالی – Request Data

عنوان نوع وضعیت مقادیر توضیحات
code Integer اختیاری نام کاربری دریافت شده در صورت وجود کد فقط کد مورد نظر بازگشت داده می شود.
{
    "code": "Error Code"
}

پاسخ صحیح – Response True

عنوان نوع مقادیر توضیحات
status Boolean true مقدار در پاسخ صحیح همیشه true است
time Timestamp زمان تولید پاسخ این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود.
data Array    
data[Index].title String شرح خطا به زبان فارسی  
data[Index].solution String روش حل خطا به زبان فارسی  

دریافت این پاسخ با Status Code 200 دریافت خواهد شد.

{
    "status": true,
    "time": "Timestamp", // Timestamp
    "data": [
        {
            "title": "Error title in Persian",
            "solution": "How to solve errors in Persian"
        },
        ...
    ]
}

 

پاسخ نادرست – Response False

عنوان نوع مقادیر توضیحات
status Boolean false مقدار در پاسخ نادرست همیشه false است
time Timestamp زمان تولید پاسخ این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود.
code Integer شماره خطا مربوطه
{
    "status": false,
    "time": "Timestamp", // Timestamp
    "code": "Error Code"
}