پرش به محتویات

مدیریت خطا

یکی از تضمین‌های Elm این است که در عمل خطای زمان اجرا نخواهید دید. به این دلیل که Elm خطا را به عنوان داده در نظر می‌گیرد. با مدل‌سازی نوع داده سفارشی، احتمال بروز خطا را بطور صریح کاهش می‌دهیم که این کار باعث می‌شود برنامه در زمان اجرا خراب نشود. برای نمونه، فرض کنید می‌خواهید ورودی کاربر را به یک سن تبدیل کنید. ممکن است نوع داده سفارشی مانند این ایجاد کنید:

type MaybeAge
  = Age Int
  | InvalidInput

toAge : String -> MaybeAge
toAge userInput =
  ...

-- toAge "24" == Age 24
-- toAge "99" == Age 99
-- toAge "ZZ" == InvalidInput

مهم نیست چه ورودی به تابع toAge داده شود، این تابع همیشه یک مقدار تولید می‌کند. ورودی معتبر مقادیر مانند Age 24 و Age 99، در حالی که ورودی نامعتبر مقدار InvalidInput را تولید می‌کند. در ادامه، از تکنیک تطبیق الگو استفاده می‌کنیم تا اطمینان حاصل شود هر دو احتمال در نظر گرفته شده‌اند. به همین دلیل، برنامه کِرَش نمی‌کند!

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

type MaybePost
  = NoTitle
  | NoContent
  | Post { title : String, content : String }

toPost : String -> String -> MaybePost
toPost title content =
  ...

-- toPost ""   ""     == NoTitle
-- toPost "hi" ""     == NoContent
-- toPost "hi" "sup?" == Post { title = "hi", content = "sup?" }

بجای اینکه بگوییم ورودی نامعتبر است، هر یک از راه‌هایی که ممکن است اشتباه پیش رفته باشد را توصیف می‌کنیم. اگر یک تابع viewPreview : MaybePost -> Html msg برای پیشنمایش پست‌های معتبر داشته باشیم، اکنون می‌توانیم پیام‌های خطای مرتبط با هر حالت را در ناحیه پیشنمایش ارایه دهیم!

این نوع موقعیت‌ها بسیار رایج هستند. اغلب ارزشمند است که یک نوع داده سفارشی برای وضعیت دقیق خود ایجاد کنید، اما در برخی از موارد، می‌توانید بجای آن از یک نوع داده آماده استفاده کنید. بنابراین بقیه این فصل به بررسی انواع داده Maybe و Result می‌پردازد و نشان می‌دهد که چگونه می‌توانند به شما کمک کنند تا خطاها را به عنوان داده در نظر بگیرید!