Visual Basic .NET에서는 애플리케이션에서 발생한 특정 오류를 보다 명확히 나타내기 위해 사용자 정의 예외를 생성할 수 있습니다. 이를 위해서는 System.Exception 클래스(또는 그 하위 클래스)로부터 새로운 클래스를 상속받고, 필요에 따라 추가 정보를 전달하기 위한 새로운 속성을 추가해야 합니다.
사용자 정의 예외는 코드의 가독성과 유지보수성을 높이는 데 도움이 되며, 특히 특정 비즈니스 시나리오에 대한 특화된 처리가 필요할 때 유용합니다.
예제:
Public Class InvalidUserNameException Inherits ApplicationException Public Sub New(message As String) MyBase.New(message) End Sub End Class ' 사용 예: Sub ValidateUserName(userName As String) If userName = "" Then Throw New InvalidUserNameException("사용자 이름은 비어 있을 수 없습니다") End If End Sub
질문: "Visual Basic에서 단순히 문자열을 사용하여 Throw "오류"를 던질 수 있나요? Try...Catch에서 처리할 수 있나요?"
답변: 아니요, 그렇게 할 수 없습니다. Throw 연산자는 Exception 유형의 객체를 요구합니다. 문자열을 던지려고 하면(Throw "err") 컴파일 오류가 발생합니다. 항상 Exception 클래스의 새로운 인스턴스 또는 그 하위 인스턴스를 생성해야 합니다.
잘못된 코드 예:
' 이것은 오류를 발생시킵니다! Throw "오류!"
올바른 코드 예:
Throw New Exception("오류!")
이야기:
대규모 프로젝트에서 한 개발자가
Throw "잘못된 데이터!"를 사용하여 예외를 던졌습니다. 이는 컴파일 시 오류를 초래하였고, 코드가 정적 검사를 통과하지 못했기 때문에 프로덕션에서 문제가 발생했습니다. 올바른 예외 처리가 없어서 릴리스가 일주일 지연되는 상황이 발생했습니다.
이야기:
팀은 InnerException 매개변수가 있는 생성자를 추가하지 않고 사용자 정의 예외를 만들었습니다. 복잡한 오류를 시诊할 때 원래의 예외를 '포함'할 수 없어서 호출 스택이 손실되었습니다. 결과적으로 오류의 원인을 찾기가 어려워졌습니다.
이야기:
미디어 애플리케이션에서 사용자 정의 예외가 너무 자주 사용되었고 그 목적에 맞지 않게 사용되었습니다(예: 잘못된 데이터 입력 시마다). 그 결과 시스템 성능이 저하되었습니다. 예외 생성이 운영적으로 비용이 많이 드는 작업이기 때문입니다. 검토 후 이러한 예외 중 일부는 일반 조건 검사를 사용하여 교체되었습니다.