예외: raise 및 reraise 함수

예외: raise 및 reraise 함수

raise 함수는 오류나 예외 상황이 발생했음을 알리는 데 사용하고, reraise 함수는 이미 처리한 예외를 호출 체인 위쪽으로 다시 전파하는 데 사용해요. 이번 글에서는 두 함수의 쓰임새와 동작 방식을 코드로 살펴볼게요.

출처: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/exception-handling/the-raise-function

본문

In this article

raise 함수는 오류나 예외적인 조건이 발생했음을 나타내는 데 사용됩니다. 오류에 대한 정보는 예외 객체에 담깁니다.

reraise 함수는 처리된 예외를 호출 체인(call chain) 위쪽으로 전파하는 데 사용됩니다.

Syntax

raise (expression)

Remarks

raise 함수는 예외 객체를 생성하고 스택 풀기(stack unwinding) 과정을 시작합니다. 이 스택 풀기 과정은 공용 언어 런타임(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

Reraising an exception

reraise 함수는 with 블록 안에서 처리된 예외를 호출 체인 위쪽으로 전파하는 데 사용할 수 있습니다.

reraise는 예외 피연산자를 받지 않습니다. 어떤 메서드가 호출자로부터 받은 인자를 다른 라이브러리 메서드에 넘겨주고, 그 라이브러리 메서드가 호출자에게 다시 전달해야 하는 예외를 발생시킬 때 가장 유용합니다.

reraise 함수는 계산된 목록, 배열, 시퀀스 또는 task { .. }async { .. }를 포함한 컴퓨터 식(computation expression)의 try/with 구조에 있는 with 블록에서는 사용할 수 없습니다.

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@()

See also

  • Exception Handling
  • Exception Types
  • Exceptions: The try...with Expression
  • Exceptions: The try...finally Expression
  • Exceptions: The failwith Function
  • Exceptions: The invalidArg Function

더 알아보기 (Learn more)

이 문서는 함께 보면 좋을 연관 주제들을 안내해요. 예외 처리의 전체 그림을 잡으려면 다음 문서들을 이어서 읽어보세요.

  • Exception Handling — 예외 처리 전반에 대한 개요입니다.
  • Exception Types — F#의 예외 타입 정의에 대해 다룹니다.
  • Exceptions: The try...with Expression — 예외를 잡아 처리하는 try...with 식을 설명합니다.
  • Exceptions: The try...finally Expression — 정리 작업을 보장하는 try...finally 식을 다룹니다.
  • Exceptions: The failwith Function — F# 식에서 오류를 발생시키는 failwith 함수를 소개합니다.
  • Exceptions: The invalidArg Function — 인자 검증 실패 시 예외를 발생시키는 invalidArg 함수를 소개합니다.

팁: 이 문서의 원문은 GitHub에 공개되어 있어요. 내용 수정이나 이슈 제기, 풀 리퀘스트 참여를 원한다면 저장소와 기여 가이드를 확인해 보세요.

마지막 업데이트: 2021-11-04

원문: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/exception-handling/the-raise-function