22.02.06_Csharp예외처리하기
본문 바로가기
CS Study/Csharp

22.02.06_Csharp예외처리하기

by KyeongMin 2022. 2. 6.
728x90
반응형

  • 예외가 프로그램의 오류나 다운으로 이어지지 않도록 적절하게 처리하는 것을 예외 처리 라고 함

1.try~catch로 예외 받기

try
{
    //실행하고자 하는 코드
}
catch(예외_객체_1)
{
    //예외가 발생했을 때의 처리
}
catch(예외_객체_2)
{
    //예외가 발생했을 때의 처리
}

//사용
try
{
    for(int i=0; i<5 ;i++)
    {
        Console.WriteLine(arr[i]);
    }
}
catch (indexOutOfRangeException e)
{
    Console.WriteLine($"예외가 발생했습니다 : {e.Message}")''
}

2.System.Exception 클래스

  • 이것은 모든 예외의 조상임
    • 모든 예외 클래스는 반드시 위 클래스로 부터 상속받아야 함
try
{
}
catch(Exception e)
{
    //
}
  • 모든것이 이 클래스를 상속하니까 저렇게 하면 다 받을 수 있다고 생각할 수 있음
  • 하지만 예외 상황에 따라 섬세한 예외 처리가 필요한 코드에서는 Exception 클래스만으로 대응이 어려우므로
    • 귀찮다고 저렇게 하면 안됨

3.예외 던지기

try
{
    //
    throw new Exception("예외를 던짐");// throw문을 통해 던져진 예외 객체는 catch문을 통해 받음
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}
  • C#7.0 부터는 식으로도 사용가능
  • int? a = null;
    int b = a ?? throw new ArgumnetNullException();

4.try~catch와 finally

  • try 블록의 자원 해제 같은 중요한 코들르 미쳐 실행하지 못하는 경우 이는 곧 버그를 만듦
    • 예를 들면 아래 코드와 같이 try블록 끝에 데이터베이스 커넥션을 닫는게 있는데 갑자기 예외때문에
    • 실행하지 못한다면 사용할 수 있는 커넥션이 점점 줄어 DB연결 할 수없는상태가 될 수 있음
    try
    {
        dbconn.Open();
        //
        dbconn.Close();//이것 때문에 버그생길수 있음
    }
    catch(XXXException e)
    {
        //
    }
    catch(YYYException e)
    {
        //
    }
    • 저게 제대로 실행이 안될때 생기는 버그이기 때문에 catch에 한개씩 다넣어주면 된다 생각하지만
    • dry법칙에 어긋남
      • 이렇게 하면됨
    • //마지막 단에 finally추가
      finally
      {
          db.conn.Close();
      }

5.사용자 정의 예외 클래스 만들기

  • 왠만한 예외의 경우 지원을 하지만 그런게 아닌경우 만들어야함
using System;

namespace MyException
{
    class InvalidArgumentException : Exception
    {
        public InvalidArgumentException()
        {
		}
        
        public InvalidArgumentException(stirng message) : base(message)
        {
		}
        
        public object Argument
        {
            get; set;
		}
        
        public string Range
        {
            get; set;
		}
    }
}
  • 위와 같이 만들어 사용할 수 있음

6.예외 필터하기

  • c#6.0부터 catch절이 받아들일 예외 객체에 제약 사항을 명시해서 해당 조건을 만족하는
    • 예외 객체에 대해서만 예외 처리 코드를 실행할 수 있도록 하는 예외 필터가 도입
    • 사용은 catch() 절 뒤에 when 키워드를 이용해서 제약 조건을 기술하면 됨
class FilterableException : Exception
{
	public int Error No {get:set;}
}
try
{
	int num = GetNumber();
	if (num < 0 | num > 10)
	throw new FilterableException() { ErrorNo = num };
	else
	Console.WriteLine($"Output : {num}");
}
catch (FilterableException e) when (e.ErrorNo <0)
{
	Console.WriteLine("Negative input is not allowed.");
}

7.예외처리 다시 생각해보기

  • 예외처리를 지원하지 않는 다면?
  • 메소드 내부에서 문제가 생기면 어떻게 호출자에게 그 문제를 알릴까?
    • 에러코드를 반환하는 방법?
    • 어떻게든 비슷하게 할 수는 있겠지만 try~catch문을 이용한 예외 처리는
    • 실제 일을 하는 코드와 문제를 처리하는 코드를 분리해 코드를 간결하게함
  • 즉, 어디에 에러가 났는지 알려주기때문에 디버깅시 유용함

 

https://github.com/3DPIT/study/blob/master/02.studyData/05.Csharp/2022/02/0206/%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0/22.02.06_Csharp%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0.md

 

GitHub - 3DPIT/study

Contribute to 3DPIT/study development by creating an account on GitHub.

github.com

 

728x90
반응형

'CS Study > Csharp' 카테고리의 다른 글

22.02.07_Csharp람다식  (0) 2022.02.07
22.02.06_Csharp대리자와이벤트  (0) 2022.02.06
22.02.05_Csharp일반화프로그래밍  (0) 2022.02.06
22.02.05_C#배열  (0) 2022.02.05
22.02.04_C#프로퍼티  (0) 2022.02.05

댓글