Fsharp Exception Handling Fsharp Exception Handling Fsharp Exception Handling Fsharp Exception Handling
کنترل خطا یا Exception Handling در #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 |
جایی که،
- exception-type نام یک F# exception جدید است.
- argument-type نشان دهنده نوعی از یک ارگومان است که می تواند هنگامی که مطرح کردید یک exception از این نوع را، عرضه شود.
- آرگومان چندگانه را می توان با استفاده از انواع چندگانه برای 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 |
مثال
تابع 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. … |