سلام درود خدمت همراهان همیشگی سایت پی وی لرن . با آموزش زبان برنامه نویسی #F همراهتون هستیم. در صورتی که جایی از کد دارای اشکال شود، چهارچوب کاری NET. ، یک خطا یا Exception اعلام می کند. این بار قصد داریم کنترل خطا یا Exception Handling در #F و دستورالعمل پایه برای F# exception handling block و سینتکس عملکرد تابع failwith در #F و… رو بررسی می نماییم.
exception مشکلی است که در هنگام اجرای یک برنامه رخ می دهد. مانند تلاش برای تقسیم بر صفر.
exception راهی برای انتقال کنترل از یک قسمت از یک برنامه به قسمت دیگر را ارائه می دهد.
مدیریت exception در #F ساختارهای زیر را فراهم می کند.( کنترل خطا یا Exception Handling در #F )
ساخت | توضیحات |
---|---|
raise expr | exception داده شده را اعلام می کند . |
failwith expr | System.Exception exception را اعلام می کند. |
try expr with rules | گرفتن عبارات مطابق با قوانین الگو |
try expr finally expr | اجرای آخر عبارت در زمانی که محاسبات موفق بوده و وقتی یک exception مطرح می شود. |
| 😕 ArgumentException | یک قاعده منطبق با نوع NET exception. |
| 😕 ArgumentException as e | یک قاعده مطابق با نوع NET exception. داده شده، اتصال نام e به مقدار exception object. |
| Failure(msg) → expr | یک قاعده مطابق با data-carrying F# exception داده شده است. |
| exn → expr | یک قاعده منطبق با هر exception، اتصال نام exn به مقدار exception object. |
| exn when expr → expr | یک قانون منطبق با exception در شرایط داده شده، نام exn را به مقدار exception object مرتبط می کند. |
اجازه دهید ما با دستورالعمل اساسی Exception Handling شروع کنیم.
دستورالعمل پایه برای F# exception handling block در زیر آمده است .
1 | exception exception-type of argument-type |
جایی که،
عبارت try…with برای مدیریت exception در زبان F # استفاده می شود.
سینتکس برای بیان try…with در زیر آمده است.
1 2 3 4 5 6 | try expression1 with | pattern1 -> expression2 | pattern2 -> expression3 ... |
عبارت try…with به شما امکان می دهد کد clean-up را اجرا کنید حتی اگر یک بلوک از یک exception را پرتاب کند.
سینتکس برای …try
1 2 3 4 | try expression1 finally expression2 |
تابع raise استفاده می شود تا نشان دهد که یک error یا وضعیت استثنایی رخ داده است. همچنین اطلاعات مربوط به خطا در آبجکت exception را ضبط می کند.
سینتکس برای تابع raise است.
1 | raise (expression) |
تابع failurewith یک #exception F تولید می کند.
سینتکس عملکرد تابع failwith در #F
1 | failwith error-message-string |
تابع invalidArg یک آرکومان exception را تولید می کند.
1 | invalidArg parameter-name error-message-string |
مثال Exception Handling
برنامه زیر نشان می دهد Exception Handling پایه را با یک بلوک ساده try… with.
1 2 3 4 5 6 7 | let divisionprog x y = try Some (x / y) with | :? System.DivideByZeroException -> printfn "Division by zero!"; None let result1 = divisionprog 100 0 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 | Division by zero! |
#F یک نوع exception را برای اعلان exception ارائه می دهد. شما می توانید از نوع exception مستقیما در فیلترها در عبارت try…with استفاده کنید.
مثال زیر این را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 | exception Error1 of string // Using a tuple type as the argument type. exception Error2 of string * int let myfunction x y = try if x = y then raise (Error1("Equal Number Error")) else raise (Error2("Error Not detected", 100)) with | Error1(str) -> printfn "Error1 %s" str | Error2(str, i) -> printfn "Error2 %s %d" str i myfunction 20 10 myfunction 5 5 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 | Error2 Error Not detected 100 Error1 Equal Number Error |
مثال زیر exception handling تو در تو را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | exception InnerError of string exception OuterError of string let func1 x y = try try if x = y then raise (InnerError("inner error")) else raise (OuterError("outer error")) with | InnerError(str) -> printfn "Error:%s" str finally printfn "From the finally block." let func2 x y = try func1 x y with | OuterError(str) -> printfn "Error: %s" str func2 100 150 func2 100 100 func2 100 120 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 5 6 | From the finally block. Error: outer error Error:inner error From the finally block. From the finally block. Error: outer error |
تابع زیر عملکرد failwith را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let divisionFunc x y = if (y = 0) then failwith "Divisor cannot be zero." else x / y let trydivisionFunc x y = try divisionFunc x y with | Failure(msg) -> printfn "%s" msg; 0 let result1 = trydivisionFunc 100 0 let result2 = trydivisionFunc 100 4 printfn "%A" result1 printfn "%A" result2 |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 | Divisor cannot be zero. 0 25 |
خب اینم از مثال سینتکس عملکرد تابع failwith در #F .
تابع invalidArg یک آرگومان exception را تولید می کند. برنامه زیر این را نشان می دهد.
1 2 3 4 5 6 7 8 9 | let days = [| "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" |] let findDay day = if (day > 7 || day < 1) then invalidArg "day" (sprintf "You have entered %d." day) days.[day - 1] printfn "%s" (findDay 1) printfn "%s" (findDay 5) printfn "%s" (findDay 9) |
هنگامی که شما برنامه را کامپایل و اجرا می کنید، خروجی زیر را تولید می کند.
1 2 3 4 5 | Sunday Thursday Unhandled Exception: System.ArgumentException: You have entered 9. … |
بعضی از اطلاعات دیگر در مورد فایل ها و متغیر ها باعث error در سیستم می شود که بسته به سیستم، نمایش داده خواهد شد.
تا این جا کنترل خطا یا Exception Handling در #F و دستورالعمل پایه برای F# exception handling block و سینتکس عملکرد تابع failwith در #F و… رو بررسی نمودیم.ادامه مباحث رو در جلسه بعد داریم.