ข้อยกเว้นมีความหมายที่ จำกัด อย่างยิ่ง พวกเขาจะต้องจัดการอย่างแน่นอนว่าพวกเขาจะถูกโยนหรือในสายตรงขึ้นไปข้างบนและไม่มีการบ่งชี้ถึงโปรแกรมเมอร์ในเวลารวบรวมหากคุณลืมที่จะทำ
คมชัดนี้กับเอล์มที่มีข้อผิดพลาดจะถูกเข้ารหัสเป็นผลหรือตัวสำรองซึ่งมีทั้งค่า นั่นหมายความว่าคุณได้รับข้อผิดพลาดของคอมไพเลอร์ถ้าคุณไม่จัดการกับข้อผิดพลาด คุณสามารถจัดเก็บไว้ในตัวแปรหรือแม้กระทั่งคอลเลกชันเพื่อเลื่อนการจัดการของพวกเขาไปยังเวลาที่สะดวก คุณสามารถสร้างฟังก์ชั่นเพื่อจัดการข้อผิดพลาดในลักษณะเฉพาะของแอปพลิเคชันแทนการทำบล็อค try-catch ซ้ำที่คล้ายกันทั่วสถานที่ คุณสามารถโยงมันเข้ากับการคำนวณที่ประสบความสำเร็จก็ต่อเมื่อทุกส่วนของมันประสบความสำเร็จและพวกมันไม่จำเป็นต้องถูกยัดเข้าไปในบล็อกลองเดียว คุณไม่ได้ถูก จำกัด ด้วยไวยากรณ์ในตัว
ไม่มีอะไรเหมือนกับ "การกลืนข้อยกเว้น" มันกำลังทำให้เกิดเงื่อนไขข้อผิดพลาดอย่างชัดเจนในระบบประเภทและให้ความหมายทางเลือกที่ยืดหยุ่นกว่าเพื่อจัดการกับมัน
ลองพิจารณาตัวอย่างต่อไปนี้ คุณสามารถวางสิ่งนี้ลงในhttp://elm-lang.org/tryหากคุณต้องการดูมันในทางปฏิบัติ
import Html exposing (Html, Attribute, beginnerProgram, text, div, input)
import Html.Attributes exposing (..)
import Html.Events exposing (onInput)
import String
main =
beginnerProgram { model = "", view = view, update = update }
-- UPDATE
type Msg = NewContent String
update (NewContent content) oldContent =
content
getDefault = Result.withDefault "Please enter an integer"
double = Result.map (\x -> x*2)
calculate = String.toInt >> double >> Result.map toString >> getDefault
-- VIEW
view content =
div []
[ input [ placeholder "Number to double", onInput NewContent, myStyle ] []
, div [ myStyle ] [ text (calculate content) ]
]
myStyle =
style
[ ("width", "100%")
, ("height", "40px")
, ("padding", "10px 0")
, ("font-size", "2em")
, ("text-align", "center")
]
หมายเหตุString.toInt
ในcalculate
ฟังก์ชั่นมีความเป็นไปได้ของความล้มเหลว ใน Java สิ่งนี้มีความเป็นไปได้ที่จะโยนข้อยกเว้นรันไทม์ เนื่องจากมีการอ่านอินพุตของผู้ใช้จึงมีโอกาสที่ดีพอสมควร Elm บังคับให้ฉันจัดการกับมันด้วยการคืน a Result
แต่ให้สังเกตว่าฉันไม่ต้องจัดการกับมันทันที ฉันสามารถเพิ่มอินพุตเป็นสองเท่าและแปลงเป็นสตริงได้จากนั้นตรวจสอบอินพุตที่ไม่ดีในgetDefault
ฟังก์ชัน สถานที่นี้เหมาะสำหรับการตรวจสอบมากกว่าจุดที่เกิดข้อผิดพลาดหรือสูงกว่าใน call stack
วิธีที่คอมไพเลอร์บังคับมือของเรานั้นมีความละเอียดยิ่งกว่าข้อยกเว้นที่ตรวจสอบโดยจาวา คุณจำเป็นต้องใช้ฟังก์ชั่นที่เฉพาะเจาะจงอย่างเช่นResult.withDefault
เพื่อดึงค่าที่คุณต้องการ ในขณะที่ในทางเทคนิคคุณสามารถใช้กลไกแบบนั้นในทางที่ผิด แต่ก็มีประเด็นไม่มากนัก เนื่องจากคุณสามารถเลื่อนการตัดสินใจได้จนกว่าคุณจะทราบว่ามีข้อความแจ้งข้อผิดพลาดเริ่มต้น / ข้อผิดพลาดที่ดี