Elm - การจัดการข้อผิดพลาด
ข้อผิดพลาดคือเงื่อนไขที่ไม่คาดคิดในโปรแกรม ข้อผิดพลาดอาจเกิดขึ้นในเวลาคอมไพล์หรือรันไทม์ ข้อผิดพลาดเวลาคอมไพล์เกิดขึ้นระหว่างการคอมไพล์โปรแกรม (ตัวอย่างเช่นข้อผิดพลาดในไวยากรณ์ของโปรแกรม) ในขณะที่ข้อผิดพลาดรันไทม์เกิดขึ้นระหว่างการทำงานของโปรแกรม ซึ่งแตกต่างจากภาษาโปรแกรมอื่น ๆ Elm ไม่โยนข้อผิดพลาดรันไทม์
พิจารณาแอปพลิเคชันที่ยอมรับอายุของผู้ใช้ แอปพลิเคชันควรแสดงข้อผิดพลาดหากอายุเป็นศูนย์หรือติดลบ ในกรณีนี้แอปพลิเคชัน Elm สามารถใช้แนวคิดของการจัดการข้อผิดพลาดเพื่อเพิ่มข้อผิดพลาดอย่างชัดเจนที่รันไทม์หากผู้ใช้ป้อนค่าศูนย์หรือค่าลบตามอายุ การจัดการข้อผิดพลาดระบุแนวทางการดำเนินการหากมีสิ่งที่ไม่คาดคิดเกิดขึ้นระหว่างการทำงานของโปรแกรม
ภาษาโปรแกรม Elm จัดการข้อผิดพลาดด้วยวิธีต่อไปนี้ -
- MayBe
- Result
อาจจะ
พิจารณาคุณสมบัติการค้นหาในแอปพลิเคชัน ฟังก์ชันการค้นหาจะส่งคืนข้อมูลที่เกี่ยวข้องหากพบคีย์เวิร์ดอื่นจะไม่ส่งคืนข้อมูลใด ๆ กรณีการใช้งานนี้สามารถใช้งานได้ใน Elm โดยใช้ประเภท MayBe
ไวยากรณ์
variable_name:MayBe data_type
ตัวแปรประเภท MayBe สามารถมีค่าใดค่าหนึ่งต่อไปนี้ -
Just some_Value - ใช้หากมีข้อมูลที่ถูกต้อง
Nothing - ใช้ในกรณีที่ไม่มีหรือไม่ทราบค่า ไม่มีสิ่งใดเทียบเท่ากับ null ในภาษาโปรแกรมอื่น ๆ
ภาพประกอบ
ตัวอย่างต่อไปนี้แสดงวิธีใช้ประเภท MayBe กับตัวแปรและฟังก์ชัน
Step 1 - สร้างไฟล์ MayBeDemo.elm ไฟล์และเพิ่มรหัสต่อไปนี้
-- 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 - นำเข้าโมดูลใน elm repl และดำเนินการตามที่ระบุด้านล่าง
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
ฟังก์ชันจะตรวจสอบว่าค่าที่ส่งผ่านไปยังฟังก์ชันเป็นอินเดียหรือจีนหรือศรีลังกา หากค่าของพารามิเตอร์ไม่ตรงกับค่าใด ๆ เหล่านี้จะไม่มีผลตอบแทนใด ๆ
ผลลัพธ์
พิจารณาตัวอย่างที่แอปพลิเคชันต้องตรวจสอบเงื่อนไขบางอย่างและเพิ่มข้อผิดพลาดหากเงื่อนไขไม่เป็นไปตาม ประเภทผลลัพธ์สามารถใช้เพื่อบรรลุเป้าหมายนี้ ควรใช้ประเภทผลลัพธ์หากแอปพลิเคชันต้องการเพิ่มข้อผิดพลาดอย่างชัดเจนและแสดงรายละเอียดเกี่ยวกับสิ่งที่ผิดพลาด
ไวยากรณ์
การประกาศประเภทผลลัพธ์ใช้พารามิเตอร์สองตัวคือชนิดข้อมูลของข้อผิดพลาด (โดยปกติคือ String) และชนิดข้อมูลของผลลัพธ์ที่จะส่งคืนหากทุกอย่างเรียบร้อย
type Result error_type data_value_type
= Ok data_value
| Err error_message
ประเภทผลลัพธ์จะส่งคืนค่าใดค่าหนึ่งต่อไปนี้ -
ตกลง some_value - แสดงถึงผลลัพธ์ที่จะส่งคืน
Err - แสดงข้อความแสดงข้อผิดพลาดที่จะส่งคืนหากเงื่อนไขที่คาดไว้ไม่เป็นไปตามเงื่อนไข
ภาพประกอบ 1
ลองใช้ตัวอย่างต่อไปนี้ใน 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
ฟังก์ชัน String.toInt จะส่งกลับค่าจำนวนเต็มหากพารามิเตอร์ที่ส่งผ่านนั้นถูกต้อง หากพารามิเตอร์ไม่ใช่ตัวเลขฟังก์ชันจะส่งกลับข้อผิดพลาด
ภาพประกอบ 2
ตัวอย่างต่อไปนี้ยอมรับอายุเป็นพารามิเตอร์ ฟังก์ชันจะส่งคืนอายุหากอยู่ระหว่าง 0 ถึง 135 มิฉะนั้นจะส่งคืนข้อความแสดงข้อผิดพลาดที่เหมาะสม
Step 1 - สร้างไฟล์ ResultDemo.elm และเพิ่มรหัสต่อไปนี้
--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 - นำเข้าโมดูลในแพ็คเกจ elm และดำเนินการตามที่ระบุด้านล่าง
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