예외(Exception): 프로그램 실행 중에 발생하는 오류나 비정상적인 상황을 의미. 프로그램의 정상적인 흐름을 방해하며, 발생 즉시 프로그램이 종료되지 않도록 하기 위해 예외 처리를 통해 오류를 제어하고 대처함.

 

예외 처리의 필요성: 예외 처리는 프로그램 실행 중 발생할 수 있는 다양한 오류를 예측하고 대비할 수 있는 중요한 방법. 입력 오류, 파일 읽기/쓰기 오류, 네트워크 연결 문제, 숫자 계산 오류와 같은 다양한 예외가 발생할 수 있으며, 예외 처리를 통해 프로그램의 안정성과 사용자 경험을 개선할 수 있음.

 

예외 처리 구문(try-catch-finally)

try
{
    // 예외가 발생할 가능성이 있는 코드
}
catch (Exception ex)
{
    // 예외가 발생했을 때 처리하는 코드
}
finally
{
    // 예외 발생 여부와 관계없이 항상 실행되는 코드
}
  • try  블록: 예외가 발생할 가능성이 있는 코드를 작성하는 영역. 예외가 발생하면 프로그램의 흐름이 catch 블록으로 넘어감.
  • catch 블록: try 블록에서 예외가 발생하면 실행되는 블록. 예외의 종류에 따라 여러개의 catch 블록을 작성할 수 있음.
  • finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 블록임. 주로 자원 해제(파일 닫기, 네트워크 연결 종료 등)에 사용됨.
//사용예시
try
{
    int number = int.Parse("abc"); // 정수가 아닌 문자열을 변환하려고 시도
}
catch (FormatException ex)
{
    Console.WriteLine("형식 오류: 정수로 변환할 수 없습니다.");
}
catch (Exception ex)
{
    Console.WriteLine($"예기치 않은 오류 발생: {ex.Message}");
}
finally
{
    Console.WriteLine("예외 처리 완료.");
}

 

throw 키워드: 예외를 강제로 발생시키거나 현재 예외를 다시 던질 때 사용.

//예외 발생시키기
throw new InvalidOperationException("잘못된 작업입니다.");
//예외 다시 던지기
try
{
    int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("0으로 나눌 수 없습니다.");
    throw; // 예외를 다시 던짐
}

 

예외의 종류: C#의 예외는 System.Exception 클래스를 기본으로 상속받으며, 다양한 예외 타입 존재.

  • System,Exception: 모든 예외의 기본 클래스
  • System.FormatException: 형식이 맞지 않는 경우 발생함. (예시: 문자열을 숫자로 변환할 때 형식이 맞지 않을 때)
  • System.NullReferenceException: 널 참조를 접근할 때 발생.
  • System.IndexOutOfRangeException: 배열 또는 리스트의 범위를 초과하여 접근할 때 발생.
  • System.DivideByZeroException: 0으로 나눌 때 발생.
  • System.InvalidOperationException: 잘못된 작업이 수행될 때 발생.

사용자 정의 예외: 기본 제공 예외 이외에도 사용자 정의 예외 클래스를 만들어 예외 처리를 세부적으로 할 수 있음. Exception 클래스를 상속받아 정의함.

public class CustomException : Exception
{
    public CustomException(string message) : base(message) { }
}

// 사용자 정의 예외 사용 예제
try
{
    throw new CustomException("사용자 정의 예외 발생");
}
catch (CustomException ex)
{
    Console.WriteLine($"CustomException: {ex.Message}");
}

 

장점

  • 프로그램의 안정성 향상: 예외 처리를 통해 오류 발생 시 프로그램이 예기치 않게 종료되지 않고 적절히 대처할 수 있음.
  • 코드의 가독성 향상: 오류를 예측하고 예외 처리 블록에 처리 로직을 작성하면 코드가 명확하고 이해하기 쉬워짐.
  • 자원 관리 용이: finally 블록을 사용하여 파일, 네트워크 연결 등의 자원을 안전하게 해제할 수 있음.

주의 사항

  • 불필요한 예외 처리 피하기: 예외 처리는 성능에 영향을 줄 수 있으므로, 예외가 발생할 가능성이 거의 없는 경우라면 불필요한 예외 처리를 피해야 함.
  • 구체적인 예외 처리: 구체적인 예외 타입으로 처리하여, 예상 가능한 오류에 대해 구체적으로 대응하는 것이 좋음.
  • 사용자 친화적인 메시지 제공: 예외 발생 시 사용자에게 명확한 메시지를 제공하여 이해를 도움.

 

예외 필터(Exception Filter): 특정 조건에 따라 예외를 처리할 수 있도록 catch 구문에 조건을 추가하는 기능. 이를 통해, 발생한 예외가 특정 조건을 만족할 때만 예외를 처리하거나, 조건을 만족하지 않는 예외는 다음 catch 블록이나 상위 예외 처리기로 넘길 수 있음.

 

예외 필터 구문: 예외 필터는 catch 블록에서 when 키워드와 조건식을 사용하여 정의.

 

try
{
    // 예외가 발생할 수 있는 코드
}
catch (Exception ex) when (ex.Message.Contains("특정 오류 메시지"))
{
    // 예외가 발생했고, 조건을 만족할 때만 실행되는 코드
}
//사용예시
try
{
    int number = int.Parse("abc"); // FormatException 발생
}
catch (FormatException ex) when (ex.Message.Contains("Input string was not in a correct format"))
{
    Console.WriteLine("형식 오류: 숫자 형식이 잘못되었습니다.");
}
catch (FormatException ex)
{
    Console.WriteLine("일반 형식 오류가 발생했습니다.");
}
catch (Exception ex)
{
    Console.WriteLine($"예기치 않은 오류 발생: {ex.Message}");
}

 

주의 사항

  • 성능에 영향: 예외 필터는 예외가 발생할 때 마다 조건으로 평가하므로, 복잡한 조건을 설정할 경우 성능에 영향을 줄 수 있음.
  • 예외 필터는 상태를 변경하지 않음: 예외 필터는 예외 조건을 검사할 때만 사용해야 하며, when 조건 내부에서 상태를 변경하지 않는 것이 좋음.
  • 조건 만족 여부에 따라 다음 catch 블록으로 이동: 예외 필터가 설정된 catch 블록의 조건이 만족되지 않으면, 다음 catch 블록으로 예외가 전달됨.

 

 

'2024-2 > C#' 카테고리의 다른 글

09.일반화 프로그래밍  (0) 2024.11.10
08.배열과 컬렉션, 인덱서  (0) 2024.11.10
07.프로퍼티  (0) 2024.11.10
06.인터페이스와 추상 클래스  (1) 2024.11.09
05.클래스  (2) 2024.11.09

+ Recent posts