예외와 에러의 차이

에러는 시스템에 비정상적인 문제가 발생했을 때를 말한다.

종류는 ‘컴파일 에러’, ‘런타임 에러’, ‘논리 에러’가 있으며, IDE에서 발견할 수 있으며 어플리케이션이 실행될 때는 신경쓰지 않아도 된다.

예외는 개발자가 구현한 로직에서 발생한다. 개발자로서 우리가 개발한 어플리케이션에 대한 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.

아래는 대표적인 예외 경우이다.

  • System errors, 메모리 부족 > OutOfMemroyException 예외가 던져짐.
  • Numeric errors, 메모리 오버플로우 > OverflowException 예외가 던져짐.
  • Parsing errors, 잘못된 타입 참조 > FormatException 예외가 던져짐.
  • Operation errors, 빈 리스트에서 첫번째 원소를 지우는 로직 > ArgumentOutOfRangeException 예외가 던져짐.

[예외 처리 예시(1)]

private static int? DivideNumber(int a, int b)
{
	try
	{
		return a / b;
	}
	catch (DivideByZeroException ex)
	{
		Console.WriteLine($"Attempt to divide by zero" + 
			$"Exception Msg: {ex.Message}");
		return null;
	}
	finally
	{
		Console.WriteLine("Executing finally block");
	}

}

static void Main(string[] args)
{
	// DivideNumber(10, 5); // try, finally 블록 실행
       DivideNumber(10, 0); // catch, finally 블록 실행
}

[예외처리예시(2)]

private static int? ElementAtIndex(int[] numbers, int index)
{
	try
	{
		return numbers[index];
	}
	catch (NullReferenceException)
	{
		Console.WriteLine($"Input array is null");
		return null;
	}
	catch (IndexOutOfRangeException)
	{
		Console.WriteLine($"Index {index} does not exist in input array");
		return null;
	}
	catch (Exception ex) // 모든 예외처리를 캐치하여 처리
	{
		Console.WriteLine($"Unexpected error, see message: {ex.Message}");
		return null;
	}
}

static void Main(string[] args)
{
	/* try 
	var array = new int[] {1, 2, 3, 4, 5};
	ElementAtIndex(array, 0);
	*/

	/* NullReferenceException
	var array = new int[] { };
	ElementAtIndex(array, 0);
	*/

	/* IndexOutOfRangeException
	var array = new int[] {1, 2, 3};
	ElementAtIndex(array, 3);
	*/
}

예외(Exception) 사용 시 주의할 점

Exception 이 catch 문에 포함되어있으면, 모든 예외 상황이 캐치되어 전달된다.

아래와 같이 Exception 예외를 모든 catch의 상위에 배치하면, 컴파일 에러가 발생한다.

image-20220630223406190

예외를 사용해야하는 이유

앞서 살펴본바와 같이 예외는 어플리케이션이 실행되는 동안 사용자에 의해 발생한다.

개발자로서 어플리케이션에서 발생하는 로직을 예외 처리로 콘트롤해야 한다. 그만큼 로직을 작성할 때, 유저가 사용할 영역까지 고려해야한다는 말이다.

가령 사용자에게 보여주어서는 안되는 정보를 보여주는 경우, 메모리 오버플로우 문제 등을 예외 처리로 사전에 핸들링하지 못하면 제품의 질과 퀄리티에 치명적인 타격을 입히게 되므로 주의해야한다.

태그: ,

카테고리:

업데이트:

댓글남기기