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.
…

시스템에 따라 시스템에서 오류를 일으키는 파일 및 변수에 대한 기타 정보도 표시됩니다.