Elm - Xử lý lỗi
Lỗi là bất kỳ điều kiện không mong muốn nào trong một chương trình. Lỗi có thể xảy ra trong thời gian biên dịch hoặc thời gian chạy. Lỗi thời gian biên dịch xảy ra trong quá trình biên dịch chương trình (Ví dụ: lỗi trong cú pháp của chương trình) trong khi lỗi thời gian chạy xảy ra trong quá trình thực thi chương trình. Không giống như các ngôn ngữ lập trình khác, Elm không gây ra lỗi thời gian chạy.
Xem xét một ứng dụng chấp nhận độ tuổi của người dùng. Ứng dụng sẽ thông báo lỗi nếu tuổi bằng 0 hoặc âm. Trong trường hợp này, ứng dụng Elm có thể sử dụng khái niệm xử lý lỗi để đưa ra lỗi một cách rõ ràng trong thời gian chạy nếu người dùng nhập giá trị 0 hoặc âm là tuổi. Xử lý lỗi chỉ định quá trình hành động nếu bất kỳ điều gì không mong muốn xảy ra trong quá trình thực thi chương trình.
Ngôn ngữ lập trình Elm xử lý lỗi theo những cách sau:
- MayBe
- Result
Có lẽ
Xem xét tính năng tìm kiếm trong một ứng dụng. Chức năng tìm kiếm trả về dữ liệu liên quan nếu từ khóa tìm kiếm được tìm thấy khác không trả về bất kỳ thứ gì. Trường hợp sử dụng này có thể được thực hiện trong Elm bằng cách sử dụng kiểu MayBe.
Cú pháp
variable_name:MayBe data_type
Một biến kiểu MayBe có thể chứa một trong các giá trị sau:
Just some_Value - Điều này được sử dụng nếu có dữ liệu hợp lệ.
Không có gì - Điều này được sử dụng nếu giá trị không có hoặc không xác định. Không có gì tương đương với null trong các ngôn ngữ lập trình khác.
Hình minh họa
Ví dụ sau đây cho thấy cách sử dụng kiểu MayBe với các biến và hàm.
Step 1 - Tạo một MayBeDemo.elm tệp và thêm mã sau vào nó
-- MayBeDemo.elm
module MayBeDemo exposing(..)
import Maybe
--declaring a MayBe variable and assigning value to it
userName : Maybe String
userName = Just "Mohtashim"
--declaring a MayBe variable and assigning value to it
userAge :Maybe Int
userAge = Just 20
--declaring a MayBe variable and assigning value to it
userSalary:Maybe Float
userSalary = Nothing
--declaring a custom type
type Country = India | China | SriLanka
--defining a function that takes a String parameter as input and returns a value of type MayBe
getCountryFromString : String -> Maybe Country
getCountryFromString p =
case p of
"India"
-> Just India
"China"
-> Just China
"SriLanka"
-> Just SriLanka
_
-> Nothing
Step 2 - Nhập mô-đun trong elm repl và thực thi như dưới đây
E:\ElmWorks\ErroApp> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at
-------------------------------------------------------------------------------- > import MayBeDemo exposing(..) > userName Just "Mohtashim" : Maybe.Maybe String > userAge Just 20 : Maybe.Maybe Int > userSalary Nothing : Maybe.Maybe Float > getCountryFromString "India" Just India : Maybe.Maybe MayBeDemo.Country > getCountryFromString "india" Nothing : Maybe.Maybe MayBeDemo.Country
Hàm kiểm tra xem giá trị được truyền vào hàm là Ấn Độ hay Trung Quốc hoặc SriLanka. Nếu giá trị của tham số không khớp với bất kỳ giá trị nào trong số này, nó sẽ không trả về giá trị nào.
Kết quả
Hãy xem xét một ví dụ, trong đó ứng dụng cần xác thực một số điều kiện và đưa ra lỗi nếu điều kiện không được thỏa mãn. Loại Kết quả có thể được sử dụng để đạt được điều này. Loại Kết quả nên được sử dụng nếu ứng dụng muốn nêu ra lỗi một cách rõ ràng và trả về chi tiết về những gì đã xảy ra.
Cú pháp
Khai báo Kiểu kết quả nhận hai tham số - kiểu dữ liệu của lỗi (thường là Chuỗi) và kiểu dữ liệu của kết quả sẽ được trả về nếu mọi thứ diễn ra tốt đẹp.
type Result error_type data_value_type
= Ok data_value
| Err error_message
Loại Kết quả trả về một trong các giá trị sau:
Ok some_value - Đại diện cho kết quả được trả về
Err - Đại diện cho thông báo lỗi sẽ được trả lại nếu các điều kiện mong đợi không được thỏa mãn.
Minh họa 1
Hãy thử ví dụ sau trong Elm REPL -
> String.toInt
<function> : String -> Result.Result String Int
-- successful result
> String.toInt "10"
Ok 10 : Result.Result String Int
-- unsuccessful result , Error
> String.toInt "a"
Err "could not convert string 'a' to an Int" : Result.Result String Int
Hàm String.toInt trả về giá trị Integer nếu tham số được truyền vào là hợp lệ. Nếu tham số không phải là số, hàm sẽ trả về lỗi.
Minh họa 2
Ví dụ sau chấp nhận tuổi làm tham số. Hàm trả về tuổi nếu nó nằm trong khoảng từ 0 đến 135, nếu không nó sẽ trả về một thông báo lỗi thích hợp.
Step 1 - Tạo tệp ResultDemo.elm và thêm đoạn mã sau vào đó.
--ResultDemo.elm
module ResultDemo exposing(..)
userId : Result String Int
userId = Ok 10
emailId : Result String Int
emailId = Err "Not valid emailId"
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Err r ->
Err "That is not a age!"
Ok age ->
if age < 0 then
Err "Please try again ,age can't be negative"
else if age > 135 then
Err "Please try agian,age can't be this big.."
else
Ok age
Step 2 - Nhập mô-đun trong gói elm và thực thi như bên dưới
E:\ElmWorks\ElmRepo\15_ErrorHandling\15_Code> elm repl
---- elm-repl 0.18.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> import ResultDemo exposing (..)
> userId
Ok 10 : Result.Result String Int
> emailId
Err "Not valid emailId" : Result.Result String Int
> isReasonableAge "10"
Ok 10 : Result.Result String Int
> isReasonableAge "abc"
Err "That is not a age!" : Result.Result String Int