کتابخانه‌ی استاندارد · سیستم و ابزار

خطا error

خطاهای ساختاریافته با نوع، پیام، زنجیره‌ی علت، فراداده و سیاست تلاش دوباره.

واردسازی خطا

روالی که ممکن است شکست بخورد می‌تواند یک خطا.خطا برگرداند: یا «خالی» یعنی همه‌چیز درست بوده، یا خطایی با نوع (مثل «یافت نشد») و پیام. نوع برای تصمیم‌گیری در کد است و پیام برای انسان.

وقتی خطایی از لایه‌ی پایین‌تر بالا می‌آید، آن را پیچیدن کنید تا توضیح لایه‌ی فعلی هم اضافه شود. پیام نهایی زنجیره‌ی کامل را نشان می‌دهد، مثل «ذخیره‌ی گزارش ناموفق بود: دیسک پر است»، و پیام ریشه علت اصلی را.

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

گونه‌ها

خطا Error

ساختار خطا
یک خطا.
نامانگلیسیگونهتوضیح
kindkindرشته = ""نوع خطا؛ یکی از ثابت‌های بالا یا نوعی که خودتان تعریف می‌کنید.
messagesmessagesوکتور<رشته>پیام‌های هر لایه، از درونی‌ترین علت تا بیرونی‌ترین.
kindskindsوکتور<رشته>نوع هر لایه.
tracetraceوکتور<رشته>مکان‌هایی که خطا از آن‌ها گذشته.
meta_keysmeta_keysوکتور<رشته>کلیدهای فراداده.
meta_valsmeta_valsوکتور<رشته>مقدارهای فراداده.
error-New.salam
واردسازی خطا

روال یافتن کاربر(شناسه: صحیح): خطا.خطا:
    اگر شناسه <= ۰:
        برگشت خطا.جدید(خطا.آرگومان نامعتبر، "شناسه باید مثبت باشد")
    پایان
    اگر شناسه > ۱۰۰:
        برگشت خطا.جدید در(خطا.یافت نشد، "کاربر پیدا نشد"، "یافتن کاربر")
    پایان
    برگشت خطا.خالی()
پایان

روال ریشه:
    هر ش در [۷، -۱، ۵۰۰]:
        ناپایا خ := یافتن کاربر(ش)
        اگر خطا.بدون خطا(خ):
            سرچاپ ش، "پیدا شد"، خطا.خالی است(خ)
        وگرنه:
            سرچاپ ش، خطا.نوع(خ)، خطا.پیام(خ)
            سرچاپ خطا.است(خ، خطا.یافت نشد)، خطا.یافت نشد است(خ)، خطا.آرگومان نامعتبر است(خ)
        پایان
        خطا.آزادسازی(خ)
    پایان
    ناپایا م := وکتور {} برگردان وکتور<رشته>
    دیرکن م.آزادکن()
    م.بیفزا("config.ini")
    خ۲ := خطا.جدید قالبی(خطا.ورودی خروجی، "نمی‌توان {} را خواند"، م)
    سرچاپ خطا.پیام(خ۲)
پایان
خروجی7 پیدا شد true -1 invalid_argument شناسه باید مثبت باشد false false true 500 not_found کاربر پیدا نشد true true false نمی‌توان config.ini را خواند

سیاست تکرار RetryPolicy

ساختار سیاست تکرار
سیاست تلاش دوباره.
نامانگلیسیگونهتوضیح
max_attemptsmax_attemptsصحیح = 3بیشترین تعداد تلاش؛ پیش‌فرض ۳.
base_delay_msbase_delay_msصحیح = 100تأخیر پس از نخستین تلاش ناموفق، بر حسب میلی‌ثانیه؛ پیش‌فرض ۱۰۰.
max_delay_msmax_delay_msصحیح = 5000سقف تأخیر، بر حسب میلی‌ثانیه؛ پیش‌فرض ۵۰۰۰.
error-RetryPolicy.salam
واردسازی خطا

روال ریشه:
    ناپایا س := خطا.سیاست تکرار جدید(۴، ۱۰۰، ۱۰۰۰)
    سرچاپ س.max_attempts، س.base_delay_ms، س.max_delay_ms
    خ := خطا.جدید(خطا.پایان زمان، "سرور پاسخ نداد")
    ناپایا تلاش := ۱
    تا خطا.باید تکرار شود(س، خ، تلاش):
        سرچاپ "تلاش", تلاش، "پس از", خطا.تاخیر برای تلاش(س، تلاش)، "میلی‌ثانیه"
        تلاش += ۱
    پایان
    سرچاپ خطا.باید تکرار شود(س، خطا.جدید(خطا.آرگومان نامعتبر، "ورودی بد")، ۱)
پایان
خروجی4 100 1000 تلاش 1 پس از 100 میلی‌ثانیه تلاش 2 پس از 200 میلی‌ثانیه تلاش 3 پس از 400 میلی‌ثانیه false

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

نوع نامشخص KindUnknown

پایا نوع نامشخص: رشته = "unknown"
نوع نامشخص.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

یافت نشد KindNotFound

پایا یافت نشد: رشته = "not_found"
چیزی که خواسته شده پیدا نشد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

آرگومان نامعتبر KindInvalidArgument

پایا آرگومان نامعتبر: رشته = "invalid_argument"
ورودی نادرست است؛ تلاش دوباره فایده‌ای ندارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

دسترسی رد شد KindPermissionDenied

پایا دسترسی رد شد: رشته = "permission_denied"
اجازه‌ی دسترسی نیست.
error-Kinds.salam
واردسازی خطا

روال ریشه:
    هر ن در [خطا.دسترسی رد شد، خطا.نوع از قبل موجود، خطا.پایان زمان، خطا.لغو شد، خطا.در دسترس نیست، خطا.نوع نامشخص، خطا.پیاده سازی نشده]:
        خ := خطا.جدید(ن، "نمونه")
        سرچاپ ن، خطا.دسترسی رد شد است(خ)، خطا.از قبل موجود است(خ)، خطا.پایان زمان است(خ)، خطا.لغو شد است(خ)، خطا.در دسترس نیست است(خ)، خطا.قابل تکرار است(خ)
    پایان
پایان
خروجیpermission_denied true false false false false false already_exists false true false false false false timeout false false true false false true canceled false false false true false false unavailable false false false false true true unknown false false false false false false unimplemented false false false false false false

نوع از قبل موجود KindAlreadyExists

پایا نوع از قبل موجود: رشته = "already_exists"
از قبل وجود دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

در دسترس نیست KindUnavailable

پایا در دسترس نیست: رشته = "unavailable"
سرویس فعلاً در دسترس نیست؛ می‌شود دوباره تلاش کرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

پایان زمان KindTimeout

پایا پایان زمان: رشته = "timeout"
زمان به پایان رسید؛ می‌شود دوباره تلاش کرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

لغو شد KindCanceled

پایا لغو شد: رشته = "canceled"
کار لغو شد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

داخلی KindInternal

پایا داخلی: رشته = "internal"
اشکال داخلی برنامه.
error-Wrap.salam
واردسازی خطا

روال ریشه:
    ریشه‌ی خطا := خطا.جدید(خطا.ورودی خروجی، "دیسک پر است")
    ب := خطا.پیچیدن(ریشه‌ی خطا، "ذخیره‌ی گزارش ناموفق بود")
    ب۲ := خطا.پیچیدن در(ب، "پردازش شبانه متوقف شد"، "کار شبانه")
    ب۳ := خطا.پیچیدن با نوع(ب۲، خطا.داخلی، "خطای داخلی")
    ب۴ := خطا.با فراداده(ب۳، "disk"، "/dev/sda1")
    سرچاپ خطا.پیام(ب۴)
    سرچاپ خطا.پیام ریشه(ب۴)
    سرچاپ خطا.نوع(ب۴)، خطا.داخلی است(ب۴)، خطا.فراداده(ب۴، "disk")
    سرچاپ خطا.ردیابی(ب۴)
    سرچاپ خطا.قالب(ب۴)
پایان
خروجیخطای داخلی: پردازش شبانه متوقف شد: ذخیره‌ی گزارش ناموفق بود: دیسک پر است دیسک پر است internal true /dev/sda1 کار شبانه [internal] خطای داخلی: پردازش شبانه متوقف شد: ذخیره‌ی گزارش ناموفق بود: دیسک پر است trace: کار شبانه disk=/dev/sda1

ورودی خروجی KindIO

پایا ورودی خروجی: رشته = "io"
خطای خواندن یا نوشتن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

پیاده سازی نشده KindUnimplemented

پایا پیاده سازی نشده: رشته = "unimplemented"
هنوز پیاده نشده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

روال‌ها

خالی Nil

روال خالی(): خطا
خطای خالی؛ یعنی «بدون خطا».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

خالی است IsNil

روال خالی است(e: خطا): منطقی
اگر خطا خالی باشد، درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

بدون خطا Ok

روال بدون خطا(e: خطا): منطقی
همان خالی است؛ خواناتر در شرط‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

جدید New

روال جدید(kind: رشته، message: رشته): خطا
خطای تازه‌ای با نوع و پیام.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

جدید در NewAt

روال جدید در(kind: رشته، message: رشته، at: رشته): خطا
خطای تازه، همراه با نام مکانی که رخ داده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

جدید قالبی Newf

روال جدید قالبی(kind: رشته، tmpl: رشته، args: وکتور<رشته>): خطا
خطای تازه با پیام قالبی؛ هر {} با مقدار بعدی پر می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

پیچیدن Wrap

روال پیچیدن(e: خطا، message: رشته): خطا
پیام تازه‌ای روی خطا می‌گذارد و پیام‌های قبلی را نگه می‌دارد؛ نوع خطا عوض نمی‌شود. اگر خطا خالی باشد، خطای تازه‌ای با نوع نامشخص می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

پیچیدن در WrapAt

روال پیچیدن در(e: خطا، message: رشته، at: رشته): خطا
مثل پیچیدن، همراه با نام مکان.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

پیچیدن با نوع WrapKind

روال پیچیدن با نوع(e: خطا، kind: رشته، message: رشته): خطا
مثل پیچیدن، و نوع خطا را هم عوض می‌کند؛ نوع قبلی برای است همچنان شناخته می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

با فراداده WithMeta

روال با فراداده(e: خطا، key: رشته، val: رشته): خطا
یک جفت کلید و مقدار به خطا اضافه می‌کند؛ مثل شناسه‌ی کاربر یا مسیر پرونده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

فراداده Meta

روال فراداده(e: خطا، key: رشته): رشته
مقدار یک کلید فراداده؛ اگر نباشد، رشته‌ی خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

نوع Kind

روال نوع(e: خطا): رشته
نوع خطا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

است Is

روال است(e: خطا، kind: رشته): منطقی
اگر نوع خطا، یا نوع یکی از علت‌هایش، همین باشد درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

پیام Message

روال پیام(e: خطا): رشته
پیام کامل با همه‌ی لایه‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

پیام ریشه RootMessage

روال پیام ریشه(e: خطا): رشته
پیام درونی‌ترین علت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

ردیابی Trace

روال ردیابی(e: خطا): رشته
مکان‌های ثبت‌شده، جداشده با ->.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

قالب Format

روال قالب(e: خطا): رشته
متن کامل برای گزارش: نوع در کروشه، پیام، مکان‌ها و فراداده، هر کدام در یک خط.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

یافت نشد است IsNotFound

روال یافت نشد است(e: خطا): منطقی
اگر خطا از نوع «یافت نشد» باشد، درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

آرگومان نامعتبر است IsInvalidArgument

روال آرگومان نامعتبر است(e: خطا): منطقی
برای نوع «آرگومان نامعتبر».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam

دسترسی رد شد است IsPermissionDenied

روال دسترسی رد شد است(e: خطا): منطقی
برای نوع «دسترسی رد شد».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

از قبل موجود است IsAlreadyExists

روال از قبل موجود است(e: خطا): منطقی
برای نوع «از قبل موجود».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

پایان زمان است IsTimeout

روال پایان زمان است(e: خطا): منطقی
برای نوع «پایان زمان».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

لغو شد است IsCanceled

روال لغو شد است(e: خطا): منطقی
برای نوع «لغو شد».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

در دسترس نیست است IsUnavailable

روال در دسترس نیست است(e: خطا): منطقی
برای نوع «در دسترس نیست».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

داخلی است IsInternal

روال داخلی است(e: خطا): منطقی
برای نوع «داخلی».

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Wrap.salam

قابل تکرار است IsRetryable

روال قابل تکرار است(e: خطا): منطقی
اگر خطا گذرا باشد و تلاش دوباره معنا داشته باشد، درست برمی‌گرداند: پایان زمان، در دسترس نبودن یا خطای خواندن و نوشتن.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam

سیاست تکرار جدید NewRetryPolicy

روال سیاست تکرار جدید(max_attempts: صحیح، base_delay_ms: صحیح، max_delay_ms: صحیح): سیاست تکرار
سیاستی با بیشترین تعداد تلاش و تأخیر پایه و سقف می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-RetryPolicy.salam

تاخیر برای تلاش DelayForAttempt

روال تاخیر برای تلاش(p &: سیاست تکرار، attempt: صحیح): صحیح
چقدر پس از شکست تلاش شماره‌ی attempt صبر کنید: برای تلاش اول همان تأخیر پایه، و پس از آن هر بار دو برابر، تا سقف.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-RetryPolicy.salam

باید تکرار شود ShouldRetry

روال باید تکرار شود(p &: سیاست تکرار، e: خطا، attempt: صحیح): منطقی
اگر خطایی رخ داده، گذراست و هنوز تلاش باقی مانده، درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-RetryPolicy.salam

آزادسازی Free

روال آزادسازی(e &: خطا)
حافظه‌ی خطا را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: error-New.salam