خطای کدگذاری encoding/encerr
خطای مشترک خواندن قالبها: نوع خطا، پیام و جای آن در متن.
واردسازی کدگذاری.خطای کدگذاری
خطای کدگذاری نوع خطای مشترک بستههای کدگذاری است: ساختاری ساده با سه فیلد kind (یکی از ثابتهای نوع)، message (متن انگلیسی) و position (جابهجایی بایتی در ورودی، یا -1). تابعهایی که ممکن است شکست بخورند آن را به شکل پارامتر خروجی err &: میگیرند: یکی با بدون خطا() بسازید، به تابع بدهید و بعد خطا است(err) را بررسی کنید.
در میان بستههای کدگذاری، اینها آن را پر میکنند: جیسون (کدگشایی، واسریال سازی و خوانندهی جریانی)، پرونده محیط (تجزیه سخت گیرانه)، مسجپک (واسریال سازی) و یامل (کدگشایی). خوانندههای دیگر، مثل تامل و اکسامال، به جای آن یک مقدار منطقی ok برمیگردانند. برای خطاهای بیرون از کدگذاری، بستهی خطا را ببینید.
اشتباههای رایج
- فراخوانی موفق خطا را پاک نمیکند. خوانندهها فقط وقتی چیزی خراب شود در
errمینویسند، پس خطای مانده از فراخوانی قبلی سر جایش میماند.مسجپک.واسریال سازیاز این هم فراتر میرود: اگر خطایی از قبل تنظیم شده باشد، بیدرنگ تهی برمیگرداند. پیش از هر فراخوانی باe = خطای کدگذاری.بدون خطا()آن را از نو بسازید. - همهی نوعها به کار نمیروند. خوانندههای استاندارد فقط
نوع اتمام ناگهانی،نوع نشانه نابجا،نوع داده اضافیونوع سفارشیرا تولید میکنند. فیلدی با نوع نادرست درجیسون.واسریال سازیبه شکلنوع نشانه نابجامیرسد و تودرتویی بیش از حد به شکلنوع سفارشی. روی نوعهایی شاخه بزنید که واقعاً میبینید و بقیه را «ورودی خراب» حساب کنید. positionبایت میشمارد، نه نویسه یا سطر؛ راهنمای نخست آن را تبدیل میکند. دریامل.کدگشاییاین عدد به جیسونی اشاره میکند که یامل درون بسته به آن ترجمه شده، پس آن را به کاربر نشان ندهید.messageانگلیسی است و برای گزارشها نوشته شده. به کاربر متن خودتان را بر پایهیkindنشان دهید.
راهنما: نشان دادن جای اشتباه به کاربر
position جایگاه بایتی درون متن است؛ دقیق است ولی آن چیزی نیست که آدم در ویرایشگر دنبالش میگردد. شکستنهای خط پیش از آن را بشمارید تا به سطر و ستون برسید، و آن را مثل کامپایلرها چاپ کنید: پرونده، سطر، ستون، پیام.
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون
واردسازی رشته
تابع جایگاه(متن: رشته، بایت: صحیح): رشته:
ناپایا سطر := ۱
ناپایا ستون := ۱
تکرار بایت در ای:
اگر متن.زیررشته(ای، ۱) == "\n":
سطر += ۱
ستون = ۱
وگرنه:
ستون += ۱
پایان
پایان
برگشت "سطر " + رشته.از عدد(سطر) + "، ستون " + رشته.از عدد(ستون)
پایان
تابع ریشه:
متن := `{
"name": "shop",
"port": 8080
"debug": true
}`
ناپایا خطا := خطای کدگذاری.بدون خطا()
_ := جیسون.کدگشایی(متن، خطا)
اگر خطای کدگذاری.خطا است(خطا):
سرچاپ "settings.json:"، جایگاه(متن، خطا.موقعیت) + ":"، خطا.پیام
پایان
پایانخواننده جایی میایستد که متوجه مشکل شده و این اغلب درست پس از اشتباه واقعی است: اینجا ویرگول در پایان سطر ۳ جا افتاده و خواننده در آغاز سطر ۴ گلایه میکند. ستونها بایت را میشمارند، پس در سطری که پیش از اشتباه متن فارسی دارد، عدد ستون از حروفی که میبینید بزرگتر است.
راهنما: یک گزارش خطا برای چند قالب
برنامهای که یک پروندهی جیسون، یک پروندهی .env و یک حافظهی نهان مسجپک بارگذاری میکند، میتواند شکست هر سه را با یک تابع رسیدگی کند، چون نوع خطایشان یکی است. تابع گزارش در برنامهی زیر نوع خطا را به توضیحی کوتاه تبدیل میکند و جایگاه بایتی و پیام را برای گزارشها چاپ میکند.
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.پرونده محیط
واردسازی کدگذاری.مسجپک
واردسازی کدگذاری.مقدار
واردسازی فشرده سازی
ساختار سقفها:
@جیسون "max_users"
همگانی بیشینه کاربر: صحیح = ۰
@جیسون "max_storage_gb"
همگانی بیشینه فضا: صحیح = ۰
پایان
تابع گزارش(منبع: رشته، خطا: خطای کدگذاری.خطای کدگذاری):
اگر وارونه خطای کدگذاری.خطا است(خطا):
سرچاپ منبع، "درست"
برگشت
پایان
ناپایا چه شد := "ورودی خراب"
اگر خطا.نوع == خطای کدگذاری.نوع اتمام ناگهانی:
چه شد = "بریده شده"
وگرنه خطا.نوع == خطای کدگذاری.نوع داده اضافی:
چه شد = "دادهی اضافی پس از پایان"
وگرنه خطا.نوع == خطای کدگذاری.نوع سفارشی:
چه شد = "پشتیبانی نمیشود"
پایان
سرچاپ منبع، چه شد، "در بایت"، خطا.موقعیت، "(" + خطا.پیام + ")"
پایان
تابع ریشه:
ناپایا خطا := خطای کدگذاری.بدون خطا()
ناپایا سقف := سقفها {}
_ := جیسون.واسریال سازی(`{"max_users": "fifty", "max_storage_gb": 20}`، سقف، خطا)
گزارش("limits.json:"، خطا)
خطا = خطای کدگذاری.بدون خطا()
_ := جیسون.کدگشایی(`{"plan": "team"} {"plan": "pro"}`، خطا)
گزارش("plan.json: "، خطا)
خطا = خطای کدگذاری.بدون خطا()
ناپایا محیط := پرونده محیط.تجزیه سخت گیرانه("PLAN=team\nSEATS=\"12\n"، خطا)
گزارش(".env: "، خطا)
پرونده محیط.آزادسازی(محیط)
ناپایا شیء := مقدار.شیء جدید()
مقدار.تنظیم کلید(شیء، "seats"، مقدار.مقدار صحیح(۱۲))
بایتها := مسجپک.سریال سازی(شیء)
خطا = خطای کدگذاری.بدون خطا()
_ := مسجپک.واسریال سازی بایتها(بایتها.داده، فشرده سازی.طول بافر(بایتها) - ۱، خطا)
گزارش("cache.bin: "، خطا)
_ := مسجپک.واسریال سازی(بایتها، خطا)
گزارش("خطای مانده:"، خطا)
خطا = خطای کدگذاری.بدون خطا()
برگشتی := مسجپک.واسریال سازی(بایتها، خطا)
گزارش("پس از پاک کردن:"، خطا)
سرچاپ "seats:"، مقدار.به صحیح(مقدار.مقدار کلید(برگشتی، "seats"))
پایاننوع نادرست در limits.json همانطور که بالاتر گفته شد به شکل نشانهی نابجا درمیآید. دادهی مسجپک یک بایت کوتاهتر بریده شده، پس ورودی خواننده تمام میشود. سه سطر آخر نشان میدهند چرا باید خطا را از نو ساخت: کدگشایی دادهی کامل با خطای مانده بیدرنگ شکست میخورد و همان فراخوانی پس از بدون خطا() درست کار میکند.
راهنما: همین خطاها در تجزیهگر خودتان
وقتی تجزیهگر کوچکی برای خودتان مینویسید، خطاها را با همین گونه گزارش کنید تا فراخوانندهها قالب شما و قالبهای استاندارد را با یک کد رسیدگی کنند. خطای اتمام ناگهانی، خطای نشانه نابجا و خطای ناهمخوانی نوع خطا و پیامی استاندارد را پر میکنند؛ خطای جدید با نوع سفارشی هر پیامی را میپذیرد. فراخوانندهها سپس میتوانند بر پایهی kind شاخه بزنند.
واردسازی کدگذاری.خطای کدگذاری
ساختار ابعاد:
همگانی پهنا: صحیح = ۰
همگانی بلندی: صحیح = ۰
پایان
تابع تجزیه اندازه(متن: رشته، خروجی &: ابعاد، خطا &: خطای کدگذاری.خطای کدگذاری): منطقی:
ضرب := متن.بیاب("x")
اگر ضرب < ۰:
خطا = خطای کدگذاری.خطای اتمام ناگهانی(متن.طول())
برگشت نادرست
پایان
پ := متن.زیررشته(۰، ضرب)
ب := متن.زیررشته(ضرب + ۱، متن.طول() - ضرب - ۱)
اگر پ == "" یا ب == "":
خطا = خطای کدگذاری.خطای نشانه نابجا("expected a number on both sides of 'x'"، ضرب)
برگشت نادرست
پایان
خروجی.پهنا = پ.به صحیح()
خروجی.بلندی = ب.به صحیح()
اگر خروجی.پهنا <= ۰ یا خروجی.بلندی <= ۰:
خطا = خطای کدگذاری.خطای جدید(خطای کدگذاری.نوع سفارشی، "اندازهها باید مثبت باشند"، ۰)
برگشت نادرست
پایان
برگشت درست
پایان
تابع ریشه:
ورودیها := ["1920x1080"، "800"، "x600"، "0x10"]
هر م در ورودیها:
ناپایا ا := ابعاد {}
ناپایا خطا := خطای کدگذاری.بدون خطا()
اگر تجزیه اندازه(م، ا، خطا):
سرچاپ م، "->"، ا.پهنا، "در"، ا.بلندی
وگرنه خطا.نوع == خطای کدگذاری.نوع اتمام ناگهانی:
سرچاپ م، "-> ناقص:"، خطا.پیام
وگرنه:
سرچاپ م، "-> نوع"، خطا.نوع، "در بایت"، خطا.موقعیت
سرچاپ " "، خطا.پیام
پایان
پایان
پایاننوعهای خطا
| ثابت | مقدار | معنا | چه کسی تولیدش میکند |
|---|---|---|---|
نوع بدون خطا | ۰ | خطایی نیست | بدون خطا() |
نوع اتمام ناگهانی | ۱ | ورودی وسط یک مقدار تمام شد | جیسون، مسجپک |
نوع نشانه نابجا | ۲ | نویسه یا واژهای که آنجا جایی ندارد، یا مقدار جیسونی با نوع نادرست برای فیلد ساختار | جیسون، پرونده محیط |
نوع یوتیاف۸ نامعتبر | ۳ | بایتهایی که UTF-8 معتبر نیستند | رزرو شده، هنوز تولید نمیشود |
نوع عدد نامعتبر | ۴ | عددی که خوانده نمیشود | رزرو شده، هنوز تولید نمیشود |
نوع عمق بیش از حد | ۵ | تودرتویی عمیقتر از حد خواننده | رزرو شده؛ جیسون و مسجپک عمق را با نوع سفارشی گزارش میکنند |
نوع ناهمخوانی | ۶ | مقداری از نوع نادرست | فقط خطای ناهمخوانی، برای کد خودتان |
نوع کلید یافت نشد | ۷ | کلیدی که لازم است پیدا نشد | رزرو شده، هنوز تولید نمیشود |
نوع داده اضافی | ۸ | ورودی بیشتر پس از یک مقدار کامل | جیسون |
نوع سفارشی | ۹۹ | هر چیز دیگر | جیسون و مسجپک (تودرتویی بیش از ۵۱۲ سطح، نوعهای پشتیبانینشدهی مسجپک) و خطاهای خودتان |
نوعهای رزروشده برای این هستند که تجزیهگرهای خودتان، و نسخههای بعدی خوانندههای استاندارد، برای این حالتها نام دقیقی داشته باشند. کد شما میتواند با آنها مقایسه کند، ولی امروز انتظار نداشته باشید خوانندههای استاندارد آنها را برگردانند.
گونهها
خطای کدگذاری EncodingError
ساختار خطای کدگذاری| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نوع | kind | صحیح | نوع خطا؛ یکی از ثابتهای نوع. |
| پیام | message | رشته = "" | پیام خطا، به انگلیسی. |
| موقعیت | position | صحیح = -1 | جای خطا در ورودی، به شکل جابهجایی بایتی از صفر؛ -1 اگر معلوم نباشد. |
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون
تابع ریشه:
ناپایا خ := خطای کدگذاری.بدون خطا()
سرچاپ خطای کدگذاری.خطا است(خ)، خ.نوع == خطای کدگذاری.نوع بدون خطا
_ := جیسون.کدگشایی(`{"a": }`، خ)
سرچاپ خطای کدگذاری.خطا است(خ)، خ.نوع، خ.موقعیت، خ.پیام
ت := خطای کدگذاری.خطای جدید(خطای کدگذاری.نوع سفارشی، "مقدار منفی مجاز نیست"، ۱۲)
سرچاپ ت.نوع، ت.پیام، ت.موقعیت
سرچاپ خطای کدگذاری.خطای اتمام ناگهانی(۴۰).نوع == خطای کدگذاری.نوع اتمام ناگهانی
سرچاپ خطای کدگذاری.خطای نشانه نابجا("انتظار ':'"، ۳).نوع == خطای کدگذاری.نوع نشانه نابجا
سرچاپ خطای کدگذاری.خطای ناهمخوانی("عدد"، ۵).پیام
سرچاپ خطای کدگذاری.نوع یوتیاف۸ نامعتبر، خطای کدگذاری.نوع عدد نامعتبر، خطای کدگذاری.نوع عمق بیش از حد، خطای کدگذاری.نوع ناهمخوانی، خطای کدگذاری.نوع کلید یافت نشد، خطای کدگذاری.نوع داده اضافی
پایانپایاها و متغیرها
نوع بدون خطا KindNone
پایا نوع بدون خطا: صحیح۳۲ = 0نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع اتمام ناگهانی KindUnexpectedEOF
پایا نوع اتمام ناگهانی: صحیح۳۲ = 1نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع نشانه نابجا KindUnexpectedToken
پایا نوع نشانه نابجا: صحیح۳۲ = 2نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع یوتیاف۸ نامعتبر KindInvalidUTF8
پایا نوع یوتیاف۸ نامعتبر: صحیح۳۲ = 3نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع عدد نامعتبر KindInvalidNumber
پایا نوع عدد نامعتبر: صحیح۳۲ = 4نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع عمق بیش از حد KindDepthExceeded
پایا نوع عمق بیش از حد: صحیح۳۲ = 5نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع ناهمخوانی KindTypeMismatch
پایا نوع ناهمخوانی: صحیح۳۲ = 6نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع کلید یافت نشد KindKeyNotFound
پایا نوع کلید یافت نشد: صحیح۳۲ = 7نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع داده اضافی KindTrailingData
پایا نوع داده اضافی: صحیح۳۲ = 8نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
نوع سفارشی KindCustom
پایا نوع سفارشی: صحیح۳۲ = 99نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
تابعها
بدون خطا NoError
تابع بدون خطا(): خطای کدگذارینمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
خطای جدید NewError
تابع خطای جدید(kind: صحیح، message: رشته، position: صحیح): خطای کدگذارینمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
خطای اتمام ناگهانی ErrUnexpectedEOF
تابع خطای اتمام ناگهانی(position: صحیح): خطای کدگذارینمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
خطای نشانه نابجا ErrUnexpectedToken
تابع خطای نشانه نابجا(message: رشته، position: صحیح): خطای کدگذارینمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
خطای ناهمخوانی ErrTypeMismatch
تابع خطای ناهمخوانی(expected: رشته، position: صحیح): خطای کدگذارینمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam
خطا است IsError
تابع خطا است(e: خطای کدگذاری): منطقیkind برابر نوع بدون خطا نباشد، درست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam