우리가 작성하는 코드들은 어떤 방식으로, 어느 순간이든 오류가 발생할 수 있다.
매개변수를 받아서 값을 반환하는 메서드가 있다고 해보자, 10번 동안 메서드를 통해서 목표로 하는 결과가 나왔다 가정해보자. 이 메서드에 다양한 값을 넣었을 때, 모든 값에 잘 대응해서 결과가 잘 나오거나, 언제나 정상적인 동작을 한다면 좋겠지만, 예상치 못한 예외가 생기게 된다면, 기능이 제대로 동작하지 못하게 되며, 최악의 경우 게임은 멈춰버린다.
try, catch, finally
try
- try안에는 예외가 발생했을 때 대응이 필요한 코드를 작성한다.
- try내의 코드에서 예외가 발생하면, catch부분의 코드를 실행한다.
- try부분에 예외가 발생하더라도 게임은 멈추지 않는다.
- catch, finally 두 개 중 하나는 try와 사용되어야 한다.
catch
- try에서 예외가 발생되어야 실행된다.
- throw로 발생된 예외나, try에서 발생한 예외 상황에 대응한다.
- 모든 예외를 처리하는 데에는 Exception을 사용하지만, 특정한 예외는 별도로 처리하고자 한다면, 따로 처리해 줄 수 있다.
- catch는 예외가 발생하는 경우에 따라서, 여러 개를 만들 수 있다.
- 내부에 예외에 대응하는 코드를 작성한다.
finally
- finally는 try의 예외 발생 여부와는 상관없이, 프로그램이 중단되는 상황을 제외하고는 try, catch 이후에 실행된다.
- 반드시 실행되어야 하는 코드를 작성한다.
throw
- 사용자가 예외 상황을 직접 발생 시킬 수 있다.
- 기존에 존재하는 모든 예외의 인스턴스를 생성하여서 만들어 던질 수 있다.
- Exception 클래스를 통해서 직접 예외를 만들어서 던질 수 있다.
- 가장 가까운 try, catch로 던져진다.
Exception
- C#에 있는 모든 예외가 상속 받는 부모 클래스다.
개발자들은 예외가 발생할 수 있는 모든 경우에 대비해야 한다. 하지만 모든 부분에 예외 처리를 할 수는 없다. 그렇기에 많이 사용하는 기능 또는 예외가 발생하면 안되는 중요한 핵심 기능은, 예외 처리가 불가피하다. 핵심이 되는 기능을 위주로 예외 처리를 한다면 좋을 것 같다.
using System;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
try
{
throw new Exception("exception!?");
}
catch(Exception exception)
{
Debug.Log(exception);
}
try
{
throw new NullReferenceException();
}
catch (NullReferenceException exception)
{
Debug.Log(exception);
}
finally
{
Debug.Log("test");
}
}
}//throw를 통해서 직접 발생시킨 예외로, exception!?이라는 로그와 NullReferenceException에 해당하는 로그가 출력되었다. 마지막으로 finally의 로그 test가 출력된다.
'유니티 > 개념 정리' 카테고리의 다른 글
| 형식 테스트 (0) | 2024.08.16 |
|---|---|
| SOLID 원칙 (0) | 2024.08.09 |
| ref와 out (0) | 2024.08.02 |
| Coroutine과 InvokeRepeating (0) | 2024.07.27 |
| Addressable Asset System (0) | 2024.07.27 |