예외 및 성능

참고 항목

이 콘텐츠는 Pearson Education, Inc.의 허가를 받아 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용어 및 패턴, 2판에서 재인쇄되었습니다. 이 버전은 2008년에 출판되었으며 이후 3판에서 완전히 개정되었습니다. 이 페이지의 정보 중 일부는 최신 정보가 아닐 수 있습니다.

예외와 관련된 한 가지 일반적인 문제는 정기적으로 실패하는 코드에 예외를 사용할 경우 구현 성능이 저하될 수 있다는 점입니다. 이는 유효한 우려입니다. 멤버가 예외를 throw하는 경우 성능이 현저하게 저하될 수 있습니다. 그러나 오류 코드 사용을 허용하지 않는 예외 지침을 엄격하게 준수하면 성능을 향상할 수 있습니다. 이 섹션에서 설명하는 두 가지 패턴은 이렇게 하는 방법을 제안합니다.

❌ 예외로 인해 성능이 저하될 수 있으므로 오류 코드를 사용하지 마세요.

성능을 향상하려면 다음 두 섹션에서 설명하는 Tester-Doer 패턴이나 Try-Parse 패턴을 사용할 수 있습니다.

Tester-Doer 패턴

경우에 따라 예외 throw 멤버의 성능은 멤버를 둘로 구분하여 향상할 수 있습니다. ICollection<T> 인터페이스의 Add 메서드를 살펴보겠습니다.

ICollection<int> numbers = ...
numbers.Add(1);

Add 메서드는 컬렉션이 읽기 전용인 경우에 throw됩니다. 따라서 메서드 호출이 자주 실패할 것으로 예상되는 시나리오에서는 성능 문제가 될 수 있습니다. 문제를 완화하는 방법 중 하나는 값을 추가하기 전에 컬렉션이 쓰기 가능한지를 테스트하는 것입니다.

ICollection<int> numbers = ...
...
if (!numbers.IsReadOnly)
{
    numbers.Add(1);
}

조건을 테스트하는 데 사용되는 멤버를 tester라고 하며, 이 예제에서는 IsReadOnly 속성입니다. 잠재적으로 throw되는 작업을 수행하는 데 사용되는 멤버를 doer라고 하며, 이 예제에서는 Add 메서드입니다.

✔️ 예외와 관련된 성능 문제를 방지하려면 일반적인 시나리오에서 예외를 throw할 수 있는 멤버에 Tester-Doer 패턴을 사용하는 것이 좋습니다.

Try-Parse 패턴

성능이 매우 중요한 API에서는 이전 섹션에서 설명한 Tester-Doer 패턴보다 훨씬 더 빠른 패턴을 사용해야 합니다. 이 패턴은 멤버 이름 조정을 요청하여 잘 정의된 테스트 사례를 멤버 의미 체계의 일부로 만듭니다. 예를 들어 DateTime은 문자열의 구문 분석이 실패할 경우 예외를 throw하는 Parse 메서드를 정의합니다. 구문 분석을 시도하는 해당 TryParse 메서드도 정의하지만 구문 분석이 실패할 경우 false를 반환하고 out 매개 변수를 사용하여 성공한 구문 분석의 결과를 반환합니다.

public struct DateTime
{
    public static DateTime Parse(string dateTime)
    {
        ...
    }
    public static bool TryParse(string dateTime, out DateTime result)
    {
        ...
    }
}

이 패턴을 사용할 때는 엄격한 조건으로 try 기능을 정의하는 것이 중요합니다. 잘 정의된 try 이외의 이유로 멤버가 실패할 경우 멤버는 해당 예외를 계속 throw해야 합니다.

✔️ 예외와 관련된 성능 문제를 방지하려면 일반적인 시나리오에서 예외를 throw할 수 있는 멤버에 Try-Parse 패턴을 사용하는 것이 좋습니다.

✔️ 이 패턴을 구현하는 메서드에 접두사 “Try” 및 부울 반환 형식을 사용하세요.

✔ Try-Parse 패턴을 사용하는 각 멤버에 대해 예외 throw 멤버를 제공하세요.

Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc의 동의로 재인쇄. 출처: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 작성자: Krzysztof Cwalina 및 Brad Abrams, 출판 정보: Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

참고 항목