예외: 함수 발생 및 다시 평가

  • raise 함수는 오류 또는 예외적 조건이 발생했음을 나타내는 데 사용됩니다. 오류에 대한 정보는 예외 개체에 캡처됩니다.
  • reraise 함수는 처리된 예외를 호출 체인에 전파하는 데 사용됩니다.

구문

raise (expression)

설명

이 함수는 raise 예외 개체를 생성하고 스택 해제 프로세스를 시작합니다. 스택 해제 프로세스는 CLR(공용 언어 런타임)에서 관리되므로 이 프로세스의 동작은 다른 .NET 언어와 동일합니다. 스택 해제 프로세스는 생성된 예외와 일치하는 예외 처리기에 대한 검색입니다. 검색이 현재 try...with 식에서 시작됩니다(있는 경우). 블록의 with 각 패턴은 순서대로 검사. 일치하는 예외 처리기가 발견되면 예외가 처리된 것으로 간주됩니다. 그렇지 않으면 스택이 해제되고 with 일치하는 처리기가 발견될 때까지 호출 체인이 검사 차단됩니다. 호출 체인에서 발생하는 모든 finally 블록은 스택이 해제될 때 순서대로 실행됩니다.

함수 raise 는 C# 또는 C++에 해당 throw 합니다.

다음 코드 예제에서는 함수를 사용하여 예외를 raise 생성하는 방법을 보여 줍니다.

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

다음 예제와 같이 . raise NET 예외를 발생 하려면 함수를 사용할 수도 있습니다.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

예외 다시 평가

이 함수는 reraise 블록에서 with 호출 체인에 처리된 예외를 전파하는 데 사용할 수 있습니다. reraise 예외 피연산자는 사용하지 않습니다. 메서드가 호출자에서 다른 라이브러리 메서드로 인수를 전달하고 라이브러리 메서드가 호출자에게 전달되어야 하는 예외를 발생시키는 경우에 가장 유용합니다.

함수는 reraise 계산된 목록, 배열, 시퀀스 또는 계산 식의 구문 블록/withtrywith 사용하거나 포함 task { .. } 하거나 async { .. }포함하지 않을 수 있습니다.

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

참고 항목