VB.NET 2008/VB - 문법

문법 - 예외 처리 Try Catch 구문

본클라쓰 2011. 4. 4. 20:34

 

Visual Basic에서는 예외처리 방식으로 구조적 및 비구조적 예외 처리를 모두 지원한다.

 

구조적 예외 처리는 단순히 예외가 포함된 컨트롤 구조체, 격리된 코드 블록 및 필터를 사용하여 예외 처리 매커니즘을 만드는 것이다. 구조적 예외 처리를 사용하면 코드를 다른 오류 형식과 구별할 수 있으며 상황에 따라 다르게 반응하는 코드를 작성할 수 있다.

 

비구조적 예외 처리는 코드 처음에 있는 on Error문이 모든 예외를 처리하게 된다.

 

구조적 예외 처리는 비구조적 예외 처리보다 훨씬 더 융통성이 있고 강력하며 유연한다. 가능하면 구조적 예외처리를 사용하는 것이 좋다. 그러나 다음 경우에는 비구조적 예외 처리를 사용한다.

 

1. 응용 프로그램의 예비 버전 또는 초안 버전을 개발하고 있으며 프로그램이 제대로 종료되지 않아도 상관 없는 경우.

2. 예외를 발생시키는 원인을 미리 정확하게 알고 있는 경우.

3. 기한이 촉박하여 빠른 시간에 응용 프로그램을 만들어야 하며 속도를 높이는 대신 유연성 면에서는 손해를 감수하려는 경우.

4. 코드가 쉽거나 너무 짧아서 예외를 생성하는 코드 분기만 테스트하면 되는 경우.

 

이 때 동일한 함수에서 구조적 예외 처리와 비구조적 예외 처리를 함께 사용할 수 없다. 즉, on Error문을 사용하는 경우 동일한 함수에 Try Catch 문을 사용할 수 없다. 만약, 어떤 환경에서도 메서드가 예외를 throw하지 않을 것이라고 보장할 수 없으며 알림용 예외 처리를 사용한다.

 

예외 처리는 그 만큼의 가치가 있어야 한다. 단순히 무엇인가 잘못되었다는 것을 알리는 것 이외에 예외 처리에서 생성된 메시지를 통해 예외가 발생한 이유 및 위치를 나타내야 한다. 단순히 "오류가 발생했습니다" 라는 사항과 함께 이러한 정보를 알리는 메시지가 없으면 사용자가 당황하게 된다.

 

 

응용 프로그램은 대부분의 오류를 예외 처리로 처리하고 응용 프로그램이 계속 실행되도록 해야 한다. 예외 처리를 사용하면 잠재적 오류애 대한 대비책을 세워 응용 프로그램이 중단되지 않는다. 예외가 발생할 수 있는 연산자를 사용하는 메서드, 예외가 발생할 수 있는 다른 프로시저를 호출 또는 액세스하는 프로시저에 오류 처리를 사용할 필요가 있다. 

 

예외를 처리할 수 없는 메서드는 예외가 발생하면 호출한 메서드나 이전 메서드로 다시 전파된다. 이전 메서드에도 예외 처리가 없으면, 예외는 이 메서드의 호출자로 다시 전파되는 일련의 과정을 거친다.

 

처리기를 찾는 작업은 응용 프로그램 내에서 호출된 일련의 프로시저인 호출 스택을 따라 연속적으로 이루어 진다. 그래도 예외 처리기를 찾지 못할 경우 오류 메시지가 표시되고 응용 프로그램을 종료된다.

 

 

오류의 종류는 컴파일 오류, 런타임 오류, 논리 오류가 있다.

 

컴파일 오류는 프로그램의 실행을 막는 오류다. 컴파일러가 이해하지 못하는 코드를 발견하면 컴파일 오류를 출력한다. 런타임 오류는 프로그램 실행 중에 발생하는 오류로 일반적으로 프로그램이 실행할 수 없는 작업을 시도할 때 발생한다. 논리 오류는 사용자가 의도한 작업을 프로그램이 수행하지 못하는 오류이다. 코드는 오류 없이 수행되지만 작업의 결과가 예상과 다르게 나올 수 있다. 예를 들면, 키를 잘못 입력하는 등의 외부 요인으로 인해 예상된 매개 변수와 동작하도록 되어 있는 응용 프로그래밍이 중단될 수 있다. 논리 오류는 일반적으로 오류 발생 원인이 분명하지 않기 때문에 가장 해결하기 어려운 형태의 오류다.

 

 

Try

 

    ' Code here attempts to do someting.

Catch

 

    ' If an error occurs, code here will run.

Finally

 

    ' Code in this block will always run.

End Try   

 

 

먼저 Try 블록의 코드가 실행된다. 오류 없이 코드가 실행되면 프로그램을 Catch 블록을 건너뒤고 Finally 블록의 코드를 실행한다.

 

만약, Try 블록에서 오류가 발생하면 실행은 Catch 블록으로 바로 건너뛰어 Catch 블록의 코드가 실행된 다음 Finally 블록의 코드가 실행된다.

 

 

Dim VarA As Integer

 

Try

 

    VarA = "테스트"     ' 정수형 변수에 문자형 데이터를 할당해 오류 발생시킴

    Console.WriteLine("VarA 값 : " & VarA)

 

Catch ex As Exception

    Console.WriteLine("Error : " & ex.Message)

Finally

    Console.WriteLine("이 문장은 무조건 실행된다.")

Ent Try

 

 

결과는

Error : "테스트" 문자열에서 'Integer' 형식으로 변환할 수 없습니다.

이 문장은 무조건 실행된다.

 

 

 

구조적 오류 처리의 장점은 오류 처리를 전달할 수 있다는 것에 있다. 메서드 안에 오류 처리 코드로 해당 메서드에서 발생한 오류를 처리하지 않고 메서드를 호출한 곳으로 오류를 전달할 수 있다. 이 때 사용하는 것이 Throw 문이다.

 

Try

 

    'Code here attempts to do something.

Catch

 

    ' If an error occurs, code here will run

    Throw New Exception("사용자 정의 오류로 변경하여 호출 메서드로 전달")

Finally

 

    ' Code in this block will alwars run.

End Try

 

 

이처럼 Throw 문을 사용하면 MVC 패턴에 따라 오류 처리를 단일화하여 하나의 개체에서 관리할 수 있다.

 

참조) http://msdn.microsoft.com/ko-kr/library/betd08h8.aspx

'VB.NET 2008 > VB - 문법' 카테고리의 다른 글

문법 - 선언된 요소  (0) 2011.04.05
문법 - 제어 구조 밖으로 제어 전달  (0) 2011.04.04
문법 - Using 블록과 With 블록  (0) 2011.04.04
문법 - 루프구조  (0) 2011.04.04
문법 - 판단구조  (0) 2011.04.04