0. 예외 처리
- 예외가 프로그램의 오류나 다운으로 이어지지 않도록 적절하게 처리하는 것
1. 예외 처리가 필요한 이유
- 아래 예제를 보자. 처리되지 않은 예외는 CLR이 출력한 것인데,
잘못된 인덱스로 배열의 요소에 접근할 경우에 배열 객체가 이 문제의 정보를
IndexOutOfRangeException의 객체에 담아서 Main() 메소드로 던진다.
Main 메소드는 이 예외를 처리할 방법이 없기 때문에 CLR에 던지게 되고,
CLR은 예외 객체에 담긴 내용을 사용자에게 출력한 후 프로그램을 강제로 종료한다.
- 프로그램은 예외에 대처할 수 있어야한다. 그러하지 않는다면 강제로 종료될 것이다.
그래서 예외 처리가 필요하다.
using System;
namespace PG
{
class MainApp
{
static void Main(string[] args)
{
int[] arr = {4,5,6];
for(int i=0; i<5 ; i++)
{
Console. WriteLine(arr[i]);
//i가 [배열 -1] 을 넘어서면 예외 던지고 종료됨
}
Console.WriteLine("종료");
}
}
}
실행결과
4
5
6
처리되지않은 예외 : System.IndexOutOfRangeException : 인덱스가 배열범위를 벗어났습니다
2. try -catch
*위 예제에서 Main()메소드는 예외를 받지 못하였다.
Main()메소드가 예외를 받는 방법은 Try Catch 문이다.
*기본 형식
try{
//실행할 코드
}
catch(예외_객체1){
//예외가 발생했을 때 어떻게 처리할 지
}
catch(예외_객체2){
//예외가 발생했을 때 어떻게 처리할 지
}
*예시
using System;
namespace PG
{
class MainApp
{
static void Main(string[] args)
{
int[] arr = {4,5,6];
try
{
for(int i=0; i<5 ; i++)
{
Console. WriteLine(arr[i]);
//i가 [배열 -1] 을 넘어서면 예외 던지고 종료됨
}
}
catch(IndexOutOfRangeException e)
{
Console.WriteLine($"예외 발생 : {e.Message}");
}
Console.WriteLine("종료");
}
}
}
3.System.Exception
*C#에서 모든 예외 클래스는 반드시 이 클래스로부터 상속받아야한다.
*IndexOutOfRangeException 예외도 System.Exception으로부터 파생되었다.
*catch 절에서 IndexOutOfRangeException을 썼었는데, 이 클래스 역시
System.Exception으로 부터 파생되었다.즉, Exception e로 대체할 수도 있다.
(단, 세세한 예외로 나누는 게 필요할 때는 Exception으로 묶는 것은 좋지 않다)
4. Throw
*Main() 메소드는 Try Catch 문으로 예외를 받았다. 예외를 던질 때는 Throw를 이용한다.
위 예제에서 보면 throw 없이도 예외를 잘 던진다. 그래서 언제 정확히 throw를 쓰는 지를
생각해볼 필요가 있다.
*Try에서 throw해서 Catch에서 예외를 받는다.
*예시
try
{
throw new Exception("예외를 던집니다");
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
5.try catch, finally
*try 블록에서 코드를 실행하다가 예외가 던져지면 프로그램의 실행이
catch 절로 바로 뛰어넘어간다. 만약 예외가 발생하여 try 블록의 중요한 코드를
미처 실행하지 못한다면 이는 버그가 된다.
*C#에서는 예외 처리를 할 때 뒷마무리를 깔끔하게 실행할 수 있도록 finally 절을
try ~ catch와 함께 제공한다.
*finally 절은 try ~ catch문의 마지막에서 사용하고, 이곳에 마지막에 실행할 코드를 넣는다.
*기본 형식
try{
}
catch(???Exception e){
}
catch(???Exception e){
}
finally{
//맨 뒤에 실행할 코드
}
*예시
-예외가 일어나지 않고 정상적으로 return해도 finally 절은 실행됩니다.
-예외가 일어나더라도 finally절은 실행됩니다.
try{
Console.WriteLine("123");
return 30;
}
catch(Exception e){
Console.WriteLine("예외");
throw e;
}
finally{
ConsoleWriteLine("끝");
}
6. 예외 필터링
*예외 필터
-예외 객체에 제약 사항을 명시해서 해당 조건을 만족하는 예외 객체에 대해서만
예외 처리 코드를 실행할 수 있도록 한다.
-catch 절 뒤에 when 키워드를 이용하면된다.
*예시
-e.ErroNo이 음수일때만 catch절에서 예외를 받을 수 있다.
class FilterableException : Exception
{
public int ErrorNo {get;set;}
}
try
{
int num = GetNumber();
if( num< 0 || num > 10)
throw new FilterableException(){ErroNo = num};
else
Console.WriteLine($"Output : {num}");
}
catch(FilterableException e) when (e.ErrorNo <0)
{
Console.WriteLine("Negative input is not allowed");
}
출처 <a href="https://kr.freepik.com/free-vector/linear-gradient-retro-cassette_13405019.htm#query=lofi&position=7&from_view=search&track=sph">작가 pikisuperstar</a> 출처 Freepik
'3_c# > C#문법' 카테고리의 다른 글
C# 프로퍼티 (1) | 2024.11.20 |
---|---|
C# 메소드 오버로딩 / 오버라이딩 (0) | 2024.10.02 |
C# TXT파일 접근 - StreamReader, StreamWriter (0) | 2023.07.18 |
C# 클래스 (0) | 2023.07.15 |
C# 인터페이스 / 추상 클래스 (0) | 2023.07.13 |