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문은 예외 발생 시 프로그램의 비정상 종료를 방지하고, 

예외를 체계적으로 처리하여 코드의 안정성유지보수성을 높일 수 있다.


(+리소스를 안전하게 해제해서 리소스 누수를 방지하고 프로그램의 안정성을 높인다.)

+ Recent posts