خطا error
خطاهای ساختاریافته با نوع، پیام، زنجیرهی علت، فراداده و سیاست تلاش دوباره.
واردسازی خطا
روالی که ممکن است شکست بخورد میتواند یک خطا.خطا برگرداند: یا «خالی» یعنی همهچیز درست بوده، یا خطایی با نوع (مثل «یافت نشد») و پیام. نوع برای تصمیمگیری در کد است و پیام برای انسان.
وقتی خطایی از لایهی پایینتر بالا میآید، آن را پیچیدن کنید تا توضیح لایهی فعلی هم اضافه شود. پیام نهایی زنجیرهی کامل را نشان میدهد، مثل «ذخیرهی گزارش ناموفق بود: دیسک پر است»، و پیام ریشه علت اصلی را.
برای خطاهای گذرا، مثل قطعی شبکه، سیاست تکرار میگوید کی و چند بار دوباره تلاش کنید و بین تلاشها چقدر صبر کنید؛ فاصله هر بار دو برابر میشود.
گونهها
خطا Error
ساختار خطا| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| kind | kind | رشته = "" | نوع خطا؛ یکی از ثابتهای بالا یا نوعی که خودتان تعریف میکنید. |
| messages | messages | وکتور<رشته> | پیامهای هر لایه، از درونیترین علت تا بیرونیترین. |
| kinds | kinds | وکتور<رشته> | نوع هر لایه. |
| trace | trace | وکتور<رشته> | مکانهایی که خطا از آنها گذشته. |
| meta_keys | meta_keys | وکتور<رشته> | کلیدهای فراداده. |
| meta_vals | meta_vals | وکتور<رشته> | مقدارهای فراداده. |
واردسازی خطا
روال یافتن کاربر(شناسه: صحیح): خطا.خطا:
اگر شناسه <= ۰:
برگشت خطا.جدید(خطا.آرگومان نامعتبر، "شناسه باید مثبت باشد")
پایان
اگر شناسه > ۱۰۰:
برگشت خطا.جدید در(خطا.یافت نشد، "کاربر پیدا نشد"، "یافتن کاربر")
پایان
برگشت خطا.خالی()
پایان
روال ریشه:
هر ش در [۷، -۱، ۵۰۰]:
ناپایا خ := یافتن کاربر(ش)
اگر خطا.بدون خطا(خ):
سرچاپ ش، "پیدا شد"، خطا.خالی است(خ)
وگرنه:
سرچاپ ش، خطا.نوع(خ)، خطا.پیام(خ)
سرچاپ خطا.است(خ، خطا.یافت نشد)، خطا.یافت نشد است(خ)، خطا.آرگومان نامعتبر است(خ)
پایان
خطا.آزادسازی(خ)
پایان
ناپایا م := وکتور {} برگردان وکتور<رشته>
دیرکن م.آزادکن()
م.بیفزا("config.ini")
خ۲ := خطا.جدید قالبی(خطا.ورودی خروجی، "نمیتوان {} را خواند"، م)
سرچاپ خطا.پیام(خ۲)
پایانسیاست تکرار RetryPolicy
ساختار سیاست تکرار| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| max_attempts | max_attempts | صحیح = 3 | بیشترین تعداد تلاش؛ پیشفرض ۳. |
| base_delay_ms | base_delay_ms | صحیح = 100 | تأخیر پس از نخستین تلاش ناموفق، بر حسب میلیثانیه؛ پیشفرض ۱۰۰. |
| max_delay_ms | max_delay_ms | صحیح = 5000 | سقف تأخیر، بر حسب میلیثانیه؛ پیشفرض ۵۰۰۰. |
واردسازی خطا
روال ریشه:
ناپایا س := خطا.سیاست تکرار جدید(۴، ۱۰۰، ۱۰۰۰)
سرچاپ س.max_attempts، س.base_delay_ms، س.max_delay_ms
خ := خطا.جدید(خطا.پایان زمان، "سرور پاسخ نداد")
ناپایا تلاش := ۱
تا خطا.باید تکرار شود(س، خ، تلاش):
سرچاپ "تلاش", تلاش، "پس از", خطا.تاخیر برای تلاش(س، تلاش)، "میلیثانیه"
تلاش += ۱
پایان
سرچاپ خطا.باید تکرار شود(س، خطا.جدید(خطا.آرگومان نامعتبر، "ورودی بد")، ۱)
پایانپایاها و متغیرها
نوع نامشخص KindUnknown
پایا نوع نامشخص: رشته = "unknown"نمونهی این مورد همراه با موارد بالاتر آمده است: error-New.salam
یافت نشد KindNotFound
پایا یافت نشد: رشته = "not_found"نمونهی این مورد همراه با موارد بالاتر آمده است: error-New.salam
آرگومان نامعتبر KindInvalidArgument
پایا آرگومان نامعتبر: رشته = "invalid_argument"نمونهی این مورد همراه با موارد بالاتر آمده است: error-New.salam
دسترسی رد شد KindPermissionDenied
پایا دسترسی رد شد: رشته = "permission_denied"واردسازی خطا
روال ریشه:
هر ن در [خطا.دسترسی رد شد، خطا.نوع از قبل موجود، خطا.پایان زمان، خطا.لغو شد، خطا.در دسترس نیست، خطا.نوع نامشخص، خطا.پیاده سازی نشده]:
خ := خطا.جدید(ن، "نمونه")
سرچاپ ن، خطا.دسترسی رد شد است(خ)، خطا.از قبل موجود است(خ)، خطا.پایان زمان است(خ)، خطا.لغو شد است(خ)، خطا.در دسترس نیست است(خ)، خطا.قابل تکرار است(خ)
پایان
پایاننوع از قبل موجود KindAlreadyExists
پایا نوع از قبل موجود: رشته = "already_exists"نمونهی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam
در دسترس نیست KindUnavailable
پایا در دسترس نیست: رشته = "unavailable"نمونهی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam
پایان زمان KindTimeout
پایا پایان زمان: رشته = "timeout"نمونهی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam
لغو شد KindCanceled
پایا لغو شد: رشته = "canceled"نمونهی این مورد همراه با موارد بالاتر آمده است: error-Kinds.salam
داخلی KindInternal
پایا داخلی: رشته = "internal"واردسازی خطا
روال ریشه:
ریشهی خطا := خطا.جدید(خطا.ورودی خروجی، "دیسک پر است")
ب := خطا.پیچیدن(ریشهی خطا، "ذخیرهی گزارش ناموفق بود")
ب۲ := خطا.پیچیدن در(ب، "پردازش شبانه متوقف شد"، "کار شبانه")
ب۳ := خطا.پیچیدن با نوع(ب۲، خطا.داخلی، "خطای داخلی")
ب۴ := خطا.با فراداده(ب۳، "disk"، "/dev/sda1")
سرچاپ خطا.پیام(ب۴)
سرچاپ خطا.پیام ریشه(ب۴)
سرچاپ خطا.نوع(ب۴)، خطا.داخلی است(ب۴)، خطا.فراداده(ب۴، "disk")
سرچاپ خطا.ردیابی(ب۴)
سرچاپ خطا.قالب(ب۴)
پایانورودی خروجی 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