کتابخانه‌ی استاندارد · کدگذاری و داده

خطای کدگذاری encoding/encerr

خطای مشترک خواندن قالب‌ها: نوع خطا، پیام و جای آن در متن.

واردسازی کدگذاری.خطای کدگذاری

خطای کدگذاری نوع خطای مشترک بسته‌های کدگذاری است: ساختاری ساده با سه فیلد kind (یکی از ثابت‌های نوع)، message (متن انگلیسی) و position (جابه‌جایی بایتی در ورودی، یا ‎-1). تابع‌هایی که ممکن است شکست بخورند آن را به شکل پارامتر خروجی err &: می‌گیرند: یکی با بدون خطا() بسازید، به تابع بدهید و بعد خطا است(err) را بررسی کنید.

در میان بسته‌های کدگذاری، این‌ها آن را پر می‌کنند: جیسون (کدگشایی، واسریال سازی و خواننده‌ی جریانی)، پرونده محیط (تجزیه سخت گیرانه)، مسج‌پک (واسریال سازی) و یامل (کدگشایی). خواننده‌های دیگر، مثل تامل و اکس‌ام‌ال، به جای آن یک مقدار منطقی ok برمی‌گردانند. برای خطاهای بیرون از کدگذاری، بسته‌ی خطا را ببینید.

اشتباه‌های رایج

  • فراخوانی موفق خطا را پاک نمی‌کند. خواننده‌ها فقط وقتی چیزی خراب شود در err می‌نویسند، پس خطای مانده از فراخوانی قبلی سر جایش می‌ماند. مسج‌پک.واسریال سازی از این هم فراتر می‌رود: اگر خطایی از قبل تنظیم شده باشد، بی‌درنگ تهی برمی‌گرداند. پیش از هر فراخوانی با e = خطای کدگذاری.بدون خطا() آن را از نو بسازید.
  • همه‌ی نوع‌ها به کار نمی‌روند. خواننده‌های استاندارد فقط نوع اتمام ناگهانی، نوع نشانه نابجا، نوع داده اضافی و نوع سفارشی را تولید می‌کنند. فیلدی با نوع نادرست در جیسون.واسریال سازی به شکل نوع نشانه نابجا می‌رسد و تودرتویی بیش از حد به شکل نوع سفارشی. روی نوع‌هایی شاخه بزنید که واقعاً می‌بینید و بقیه را «ورودی خراب» حساب کنید.
  • position بایت می‌شمارد، نه نویسه یا سطر؛ راهنمای نخست آن را تبدیل می‌کند. در یامل.کدگشایی این عدد به جیسونی اشاره می‌کند که یامل درون بسته به آن ترجمه شده، پس آن را به کاربر نشان ندهید.
  • message انگلیسی است و برای گزارش‌ها نوشته شده. به کاربر متن خودتان را بر پایه‌ی kind نشان دهید.

راهنما: نشان دادن جای اشتباه به کاربر

position جایگاه بایتی درون متن است؛ دقیق است ولی آن چیزی نیست که آدم در ویرایشگر دنبالش می‌گردد. شکستن‌های خط پیش از آن را بشمارید تا به سطر و ستون برسید، و آن را مثل کامپایلرها چاپ کنید: پرونده، سطر، ستون، پیام.

encoding-encerr-guide-position.salam
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون
واردسازی رشته

تابع جایگاه(متن: رشته، بایت: صحیح): رشته:
    ناپایا سطر := ۱
    ناپایا ستون := ۱
    تکرار بایت در ای:
        اگر متن.زیررشته(ای، ۱) == "\n":
            سطر += ۱
            ستون = ۱
        وگرنه:
            ستون += ۱
        پایان
    پایان
    برگشت "سطر " + رشته.از عدد(سطر) + "، ستون " + رشته.از عدد(ستون)
پایان

تابع ریشه:
    متن := `{
  "name": "shop",
  "port": 8080
  "debug": true
}`
    ناپایا خطا := خطای کدگذاری.بدون خطا()
    _ := جیسون.کدگشایی(متن، خطا)
    اگر خطای کدگذاری.خطا است(خطا):
        سرچاپ "settings.json:"، جایگاه(متن، خطا.موقعیت) + ":"، خطا.پیام
    پایان
پایان
خروجیsettings.json: سطر 4، ستون 3: expected ',' or '}'

خواننده جایی می‌ایستد که متوجه مشکل شده و این اغلب درست پس از اشتباه واقعی است: اینجا ویرگول در پایان سطر ۳ جا افتاده و خواننده در آغاز سطر ۴ گلایه می‌کند. ستون‌ها بایت را می‌شمارند، پس در سطری که پیش از اشتباه متن فارسی دارد، عدد ستون از حروفی که می‌بینید بزرگ‌تر است.

راهنما: یک گزارش خطا برای چند قالب

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

encoding-encerr-guide-handler.salam
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.پرونده محیط
واردسازی کدگذاری.مسج‌پک
واردسازی کدگذاری.مقدار
واردسازی فشرده سازی

ساختار سقف‌ها:
    @جیسون "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: ورودی خراب در بایت 14 (value does not match the expected type) plan.json: داده‌ی اضافی پس از پایان در بایت 17 (trailing data after JSON value) .env: ورودی خراب در بایت 10 (envfile: unterminated quoted value) cache.bin: بریده شده در بایت 7 (unexpected end of input) خطای مانده: بریده شده در بایت 7 (unexpected end of input) پس از پاک کردن: درست seats: 12

نوع نادرست در limits.json همان‌طور که بالاتر گفته شد به شکل نشانه‌ی نابجا درمی‌آید. داده‌ی مسج‌پک یک بایت کوتاه‌تر بریده شده، پس ورودی خواننده تمام می‌شود. سه سطر آخر نشان می‌دهند چرا باید خطا را از نو ساخت: کدگشایی داده‌ی کامل با خطای مانده بی‌درنگ شکست می‌خورد و همان فراخوانی پس از بدون خطا() درست کار می‌کند.

راهنما: همین خطاها در تجزیه‌گر خودتان

وقتی تجزیه‌گر کوچکی برای خودتان می‌نویسید، خطاها را با همین گونه گزارش کنید تا فراخواننده‌ها قالب شما و قالب‌های استاندارد را با یک کد رسیدگی کنند. خطای اتمام ناگهانی، خطای نشانه نابجا و خطای ناهمخوانی نوع خطا و پیامی استاندارد را پر می‌کنند؛ خطای جدید با نوع سفارشی هر پیامی را می‌پذیرد. فراخواننده‌ها سپس می‌توانند بر پایه‌ی kind شاخه بزنند.

encoding-encerr-guide-custom.salam
واردسازی کدگذاری.خطای کدگذاری

ساختار ابعاد:
    همگانی پهنا: صحیح = ۰
    همگانی بلندی: صحیح = ۰
پایان

تابع تجزیه اندازه(متن: رشته، خروجی &: ابعاد، خطا &: خطای کدگذاری.خطای کدگذاری): منطقی:
    ضرب := متن.بیاب("x")
    اگر ضرب < ۰:
        خطا = خطای کدگذاری.خطای اتمام ناگهانی(متن.طول())
        برگشت نادرست
    پایان
    پ := متن.زیررشته(۰، ضرب)
    ب := متن.زیررشته(ضرب + ۱، متن.طول() - ضرب - ۱)
    اگر پ == "" یا ب == "":
        خطا = خطای کدگذاری.خطای نشانه نابجا("expected a number on both sides of 'x'"، ضرب)
        برگشت نادرست
    پایان
    خروجی.پهنا = پ.به صحیح()
    خروجی.بلندی = ب.به صحیح()
    اگر خروجی.پهنا <= ۰ یا خروجی.بلندی <= ۰:
        خطا = خطای کدگذاری.خطای جدید(خطای کدگذاری.نوع سفارشی، "اندازه‌ها باید مثبت باشند"، ۰)
        برگشت نادرست
    پایان
    برگشت درست
پایان

تابع ریشه:
    ورودی‌ها := ["1920x1080"، "800"، "x600"، "0x10"]
    هر م در ورودی‌ها:
        ناپایا ا := ابعاد {}
        ناپایا خطا := خطای کدگذاری.بدون خطا()
        اگر تجزیه اندازه(م، ا، خطا):
            سرچاپ م، "->"، ا.پهنا، "در"، ا.بلندی
        وگرنه خطا.نوع == خطای کدگذاری.نوع اتمام ناگهانی:
            سرچاپ م، "-> ناقص:"، خطا.پیام
        وگرنه:
            سرچاپ م، "-> نوع"، خطا.نوع، "در بایت"، خطا.موقعیت
            سرچاپ "   "، خطا.پیام
        پایان
    پایان
پایان
خروجی1920x1080 -> 1920 در 1080 800 -> ناقص: unexpected end of input x600 -> نوع 2 در بایت 0 expected a number on both sides of 'x' 0x10 -> نوع 99 در بایت 0 اندازه‌ها باید مثبت باشند

نوع‌های خطا

ثابتمقدارمعناچه کسی تولیدش می‌کند
نوع بدون خطا۰خطایی نیستبدون خطا()
نوع اتمام ناگهانی۱ورودی وسط یک مقدار تمام شدجیسون، مسج‌پک
نوع نشانه نابجا۲نویسه یا واژه‌ای که آنجا جایی ندارد، یا مقدار جیسونی با نوع نادرست برای فیلد ساختارجیسون، پرونده محیط
نوع یوتی‌اف۸ نامعتبر۳بایت‌هایی که UTF-8 معتبر نیستندرزرو شده، هنوز تولید نمی‌شود
نوع عدد نامعتبر۴عددی که خوانده نمی‌شودرزرو شده، هنوز تولید نمی‌شود
نوع عمق بیش از حد۵تودرتویی عمیق‌تر از حد خوانندهرزرو شده؛ جیسون و مسج‌پک عمق را با نوع سفارشی گزارش می‌کنند
نوع ناهمخوانی۶مقداری از نوع نادرستفقط خطای ناهمخوانی، برای کد خودتان
نوع کلید یافت نشد۷کلیدی که لازم است پیدا نشدرزرو شده، هنوز تولید نمی‌شود
نوع داده اضافی۸ورودی بیشتر پس از یک مقدار کاملجیسون
نوع سفارشی۹۹هر چیز دیگرجیسون و مسج‌پک (تودرتویی بیش از ۵۱۲ سطح، نوع‌های پشتیبانی‌نشده‌ی مسج‌پک) و خطاهای خودتان

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

گونه‌ها

خطای کدگذاری EncodingError

ساختار خطای کدگذاری
خطای خواندن یا نوشتن یک قالب.
نامانگلیسیگونهتوضیح
نوعkindصحیحنوع خطا؛ یکی از ثابت‌های نوع.
پیامmessageرشته = ""پیام خطا، به انگلیسی.
موقعیتpositionصحیح = -1جای خطا در ورودی، به شکل جابه‌جایی بایتی از صفر؛ ‎-1 اگر معلوم نباشد.
encoding-encerr-Error.salam
واردسازی کدگذاری.خطای کدگذاری
واردسازی کدگذاری.جیسون

تابع ریشه:
    ناپایا خ := خطای کدگذاری.بدون خطا()
    سرچاپ خطای کدگذاری.خطا است(خ)، خ.نوع == خطای کدگذاری.نوع بدون خطا
    _ := جیسون.کدگشایی(`{"a": }`، خ)
    سرچاپ خطای کدگذاری.خطا است(خ)، خ.نوع، خ.موقعیت، خ.پیام
    ت := خطای کدگذاری.خطای جدید(خطای کدگذاری.نوع سفارشی، "مقدار منفی مجاز نیست"، ۱۲)
    سرچاپ ت.نوع، ت.پیام، ت.موقعیت
    سرچاپ خطای کدگذاری.خطای اتمام ناگهانی(۴۰).نوع == خطای کدگذاری.نوع اتمام ناگهانی
    سرچاپ خطای کدگذاری.خطای نشانه نابجا("انتظار ':'"، ۳).نوع == خطای کدگذاری.نوع نشانه نابجا
    سرچاپ خطای کدگذاری.خطای ناهمخوانی("عدد"، ۵).پیام
    سرچاپ خطای کدگذاری.نوع یوتی‌اف۸ نامعتبر، خطای کدگذاری.نوع عدد نامعتبر، خطای کدگذاری.نوع عمق بیش از حد، خطای کدگذاری.نوع ناهمخوانی، خطای کدگذاری.نوع کلید یافت نشد، خطای کدگذاری.نوع داده اضافی
پایان
خروجیfalse true true 2 6 invalid value 99 مقدار منفی مجاز نیست 12 true true expected عدد 3 4 5 6 7 8

پایاها و متغیرها

نوع بدون خطا KindNone

پایا نوع بدون خطا: صحیح۳۲ = 0
بدون خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam

نوع اتمام ناگهانی KindUnexpectedEOF

پایا نوع اتمام ناگهانی: صحیح۳۲ = 1
متن زودتر از انتظار تمام شد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam

نوع نشانه نابجا KindUnexpectedToken

پایا نوع نشانه نابجا: صحیح۳۲ = 2
نویسه یا نشانه‌ای نابجا آمد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-encerr-Error.salam

نوع یوتی‌اف۸ نامعتبر KindInvalidUTF8

پایا نوع یوتی‌اف۸ نامعتبر: صحیح۳۲ = 3
متن UTF-8 درستی نیست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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