F #-예외 처리
예외는 프로그램 실행 중에 발생하는 문제입니다. F # 예외는 0으로 나누려는 시도와 같이 프로그램이 실행되는 동안 발생하는 예외적 인 상황에 대한 응답입니다.
예외는 프로그램의 한 부분에서 다른 부분으로 제어를 전송하는 방법을 제공합니다. F # 예외 처리는 다음 구문을 제공합니다.
구성 | 기술 |
---|---|
expr 인상 | 주어진 예외를 발생시킵니다. |
failwith expr | 올립니다 System.Exception 예외. |
규칙으로 expr 시도 | 패턴 규칙과 일치하는 표현식을 포착합니다. |
expr 마지막으로 expr 시도 | 실행 finally 계산이 성공할 때와 예외가 발생할 때 모두 표현식. |
| :? ArgumentException | 지정된 .NET 예외 유형과 일치하는 규칙입니다. |
| :? ArgumentException as e | 이름을 바인딩하는 지정된 .NET 예외 유형과 일치하는 규칙 e 예외 개체 값에. |
| 실패 (msg) → expr | 지정된 데이터 전달 F # 예외와 일치하는 규칙입니다. |
| exn → expr | 이름을 바인딩하는 모든 예외와 일치하는 규칙 exn 예외 개체 값에. |
| expr → expr 일 때 exn | 주어진 조건에서 예외와 일치하는 규칙으로 이름을 바인딩합니다. exn 예외 개체 값에. |
예외 처리의 기본 구문부터 시작하겠습니다.
통사론
F # 예외 처리 블록의 기본 구문은 다음과 같습니다.
exception exception-type of argument-type
어디,
exception-type 새 F # 예외 유형의 이름입니다.
argument-type 이 유형의 예외를 발생시킬 때 제공 할 수있는 인수 유형을 나타냅니다.
인수 유형에 튜플 유형을 사용하여 여러 인수를 지정할 수 있습니다.
그만큼 try...with 식은 F # 언어에서 예외 처리에 사용됩니다.
try… with expression 구문은 다음과 같습니다.
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
그만큼 try...finally expression을 사용하면 코드 블록에서 예외가 발생하더라도 정리 코드를 실행할 수 있습니다.
try… finally 표현식의 구문은 다음과 같습니다.
try
expression1
finally
expression2
그만큼 raise함수는 오류 또는 예외 조건이 발생했음을 나타내는 데 사용됩니다. 또한 예외 개체의 오류에 대한 정보를 캡처합니다.
raise 함수의 구문은 다음과 같습니다.
raise (expression)
그만큼 failwith 함수는 F # 예외를 생성합니다.
failwith 함수의 구문은 다음과 같습니다.
failwith error-message-string
그만큼 invalidArg 함수는 인수 예외를 생성합니다.
invalidArg parameter-name error-message-string
예외 처리의 예
예 1
다음 프로그램은 간단한 try… 블록을 사용한 기본적인 예외 처리를 보여줍니다.
let divisionprog x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divisionprog 100 0
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Division by zero!
예 2
F #은 exception예외 선언을위한 유형. 필터에서 직접 예외 유형을 사용할 수 있습니다.try...with 표현.
다음 예제는 이것을 보여줍니다-
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
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Error2 Error Not detected 100
Error1 Equal Number Error
예제 3
다음 예제는 중첩 된 예외 처리를 보여줍니다.
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
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
From the finally block.
Error: outer error
Error:inner error
From the finally block.
From the finally block.
Error: outer error
예 4
다음 기능은 failwith 기능-
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
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Divisor cannot be zero.
0
25
예 5
그만큼 invalidArg함수는 인수 예외를 생성합니다. 다음 프로그램은 이것을 보여줍니다-
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)
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Sunday
Thursday
Unhandled Exception:
System.ArgumentException: You have entered 9.
…
시스템에 따라 시스템에서 오류를 일으키는 파일 및 변수에 대한 기타 정보도 표시됩니다.