try-catch
try-catch는 코드 실행 중 예외가 발생할 수 있는 상황을 처리하기 위해 사용된다.
Try문 실행 도중 예외가 발생하면 프로그램이 중단되지 않고 적절한 예외 처리 코드를 실행하게 된다. (Catch문 실행)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
try
{
// 잘못된 형식의 문자열을 정수로 변환 시도
int number = int.Parse("invalid number");
}
catch (FormatException ex)
{
// 예외 객체의 주요 속성 사용
Console.WriteLine("예외 메시지: " + ex.Message);
Console.WriteLine("스택 추적: " + ex.StackTrace);
Console.WriteLine("예외 발생 원본: " + ex.Source);
if (ex.InnerException != null)
{
Console.WriteLine("내부 예외 메시지: " + ex.InnerException.Message);
}
else
{
Console.WriteLine("내부 예외 없음");
}
}
}
}
}
이때 FormatException 이란?
C#에서 형식 변환 작업이 실패했을 때 발생하는 예외이다.
예를 들어, 문자열을 숫자나 날짜 등 다른 데이터 형식으로 변환할 때,
변환할 문자열이 올바른 형식이 아니면 FormatException이 발생한다.
Message: 예외에 대한 설명을 포함하는 문자열.
StackTrace: 예외가 발생한 위치와 호출 스택 정보를 포함하는 문자열.
InnerException: 내부 예외가 있는 경우 이를 포함하는 예외 객체
따라서 예외가 발생했을때 살펴보면
예외 메시지 (Message): Input string was not in a correct format.
> 변환하려는 문자열이 올바른 형식이 아님을 나타냄
스택 추적 (StackTrace): 예외가 발생한 위치와 호출 스택을 보여준다.
여기서 System.Number.ParseInt32, System.Int32.Parse, Program.Main에서 예외가 발생했음을 알 수 있다.
Program.cs 파일의 7번째 줄에서 예외가 발생했음을 명시
예외 발생 원본 (Source): 예외를 발생시킨 원본 애플리케이션 또는 라이브러리의 이름을 보여준다.
여기서는 mscorlib이 예외를 발생시킨 라이브러리임을 나타냄
내부 예외 (InnerException): 이 경우 내부 예외가 없으므로 "내부 예외 없음"이 출력
+++
그렇다면 try-catch는 언제 사용될까?
파일 입출력, 네트워크 통신, 데이터베이스 연결 등 예외가 발생할 가능성이 있는 작업을 수행할 때 사용된다.
예외가 발생하면 catch 블록에서 이를 처리하고, 필요에 따라 finally 블록에서 리소스를 정리한다.
***finally 블록이란?
예외가 발생하여 프로그램이 중단되더라도, finally 블록에 있는 코드는 반드시 실행되어 리소스를 정리합니다.
(리소스란 파일, 데이터베이스 연결, 네트워크 연결 등 프로그램이 사용하는 외부 자원을 의미)
ex1) 파일 리소스 정리
using System;
using System.IO;
class Program
{
static void Main()
{
StreamReader reader = null;
try
{
reader = new StreamReader("example.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("파일을 찾을 수 없습니다: " + ex.Message);
}
finally
{
// 리소스 정리
if (reader != null)
{
reader.Close();
Console.WriteLine("파일 리소스가 정리되었습니다.");
}
}
}
}
StreamReader 객체를 사용하여 파일을 읽을때,
파일이 존재하지 않으면 FileNotFoundException 예외가 발생하고, 이 예외는 catch 블록에서 처리된다.
finally 블록에서는 파일이 열려 있다면 이를 닫아 리소스를 정리한다.
ex2) 데이터베이스 연결 정리
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
SqlConnection connection = null;
try
{
connection = new SqlConnection("your_connection_string_here");
connection.Open();
// 데이터베이스 작업 수행
}
catch (SqlException ex)
{
Console.WriteLine("데이터베이스 오류: " + ex.Message);
}
finally
{
// 리소스 정리
if (connection != null && connection.State == System.Data.ConnectionState.Open)
{
connection.Close();
Console.WriteLine("데이터베이스 연결이 닫혔습니다.");
}
}
}
}
SqlConnection 객체를 사용하여 데이터베이스에 연결할때,
예외가 발생하면 catch 블록에서 이를 처리한다.
finally 블록에서는 데이터베이스 연결을 닫아 리소스를 정리한다.
ex3) 네트워크 연결 정리
using System;
using System.Net.Sockets;
class Program
{
static void Main()
{
TcpClient client = null;
try
{
client = new TcpClient("example.com", 80);
// 네트워크 작업 수행
}
catch (SocketException ex)
{
Console.WriteLine("소켓 오류: " + ex.Message);
}
finally
{
// 리소스 정리
if (client != null)
{
client.Close();
Console.WriteLine("네트워크 연결이 닫혔습니다.");
}
}
}
}
TcpClient 객체를 사용하여 네트워크에 연결 중에 예외가 발생하면 catch 블록에서 이를 처리한다.
finally 블록에서는 네트워크 연결을 닫아 리소스를 정리한다..
+++
요약한다면?
try 블록:
예외가 발생할 수 있는 코드를 포함하머, 기본적으로 실행되는 코드
catch 블록:
예외가 발생했을 때 이를 처리하는 코드
finally 블록:
예외 발생 여부와 관계없이 항상 실행되는 코드
(주로 리소스 정리 작업을 수행)
따라서
try-catch문은 예외 발생 시 프로그램의 비정상 종료를 방지하고,
예외를 체계적으로 처리하여 코드의 안정성과 유지보수성을 높일 수 있다.
(+리소스를 안전하게 해제해서 리소스 누수를 방지하고 프로그램의 안정성을 높인다.)
'유니티 C# 함수 사용 정리' 카테고리의 다른 글
[SetEase] DOTween에서 Animation Curve로 속도 커스텀 하는 방법 (0) | 2024.12.20 |
---|---|
[SetUpdate] DOTween 애니메이션이 스마트폰에서 끊기는 듯한 현상이 보인다면? (0) | 2024.12.18 |
리스트 -> 딕셔너리, 숫자 카운트 및 지정 횟수 미만인 숫자를 리스트로 반환하는 메서드 (0) | 2024.05.12 |
[LINQ] 확장 메서드 (0) | 2024.05.09 |
Resources 폴더에서 Atlas를 찾아 image 반환하기 (0) | 2024.03.25 |