나 개발자 진짜 되냐?

[ C# 기본 문법 20 ] 예외 처리 본문

C# 을 맛보았어요!/문법정리를 해보았어요!

[ C# 기본 문법 20 ] 예외 처리

Snow Rabbit 2024. 9. 23. 21:42

 

예외처리..

 

그렇지 사람이 융통성이 있지

예외도 있고

예외도 처리해야지 

암암

 

 

바로 보자!

 


🌟 예외 🌟

 

실행 중에 발생하는 예기치 않은 상황 발생

우리도 사람인지라

코딩문제도 있을것이고

 

아주 완벽한 언어도 아니기에

충돌이 있을 수도 있다.

 

그렇기 때문에

예외처리기능으로 오류 상황을 적절하게 처리하고

프로그램 실행을 지속되게 한다.

 

try
{
    // 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
    // ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
    // ExceptionType2에 해당하는 예외 처리
}
finally
{
    // 예외 발생 여부와 상관없이 항상 실행되는 코드
}

try

예외가 발생할 수 있는 코드 작성

 

catch

예외가 발생하면 예외를 처리하는 코드 작성

 

위에서부터 순서대로 실행되며

상속 관계에 있는 경우

상위 예외타입 catch가 먼저 실행

 

finally

제일 마지막 단계로

예외 발생 여부와 상관없이 항상 실행

무조건 실행!

 

마지막에 예외를 풀거나

정리하거나 뭐 처리 등등

다양하게 사용된다.

 

이 친구는 생략이 가능하다!

////////////////////try - catch //////////////////////////

try
{
    int result = 10 / 0;  // ArithmeticException 발생, 
    무한히 빼게 된다.
    Console.WriteLine("결과: " + result);
}
catch (DivideByZeroException ex)
{//try문에서 이와 같은 오류가 나면 들어오게 된다.
    Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (Exception ex)
{
    Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}
finally
{
    Console.WriteLine("finally 블록이 실행되었습니다.");
}

 

try - catch문도 있고

 

사용자 정의 예외도 있다.

 

필요에 따라 자신만의 예외 클래스를 작성할 수 있다.

 

아까와 비슷한 듯 다른 듯

 

Exception라는 클래스를 상속받아 작성하고

 

catch문을 사용해서

 

사용자 정의 예외 타입을 명시하여 예외를 처리하고,

예외에 대한 적절한 처리 로직을 작성할 수 있다.

 

위의 식과 같은 코드로,

 

사용자 정의 예외일 경우

 

public class NegativeNumberException : Exception
{
	 // 생성자
    public NegativeNumberException(string message) : base(message)
    {
    }
}

try
{
    int number = -10;
    if (number < 0)
    { // 오류던지기 throw
        throw new NegativeNumberException("음수는 처리할 수 없습니다.");
    }
}
catch (NegativeNumberException ex)
{
    Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}

 

Exception을 상속받아서 사용하고

 

두 번째 줄에 있는

: base(message)

이 친구는 이니셜라이저이라고 해서

생성자가 실행되기 전에 실행될 것들을 명시해 준다.

 

여기서 base는 부모를 뜻하며,

 

여기서는  Exception

즉 Exception의 생성자에 가서

message 메시지를 먼저 주고 와라!

 

라는 뜻이 된다.

 

 

밑에 식들은

게임을 만들 때 자주 사용하는 예외들이다.

 

읽어보도록 하자!

// 플레이어 이동
try
{
    // 플레이어 이동 코드
    if (IsPlayerCollidingWithWall())
    {
        throw new CollisionException("플레이어가 벽에 충돌했습니다!");
    }
}
catch (CollisionException ex)
{
    // 충돌 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 리소스 로딩
try
{
    // 리소스 로딩 코드
    LoadResource("image.png");
}
catch (ResourceNotFoundException ex)
{
    // 리소스가 없는 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}
catch (ResourceLoadException ex)
{
    // 리소스 로딩 중 오류가 발생한 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 게임 상태 전이
try
{
    // 상태 전이 코드
    if (currentGameState != GameState.Playing)
    {
        throw new InvalidStateException("게임이 실행 중이 아닙니다!");
    }
    // 게임 상태 전이 실행
}
catch (InvalidStateException ex)
{
    // 상태 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}

 

여기서 중요한 건!

 

예외처리는

우려되는 한에서만 진행하고

코드 엄청 긴 거 막 예외에 넣지 말자!

 

내용이 짧은거같지만..

내가 잘 활용해서 쓸 수 있을까? 가 의문이다.