프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 1.7 예외처리

Victory_HA 2022. 3. 31. 22:27

1.예외처리

  • 이메일을 파일로 저장한 후에 다시 읽는 시스템이 있다고 가정해봅시다.
  • 작성한 파일을 확실하게 읽을 수 있을까요?
  • 만약 메일이 바이러스에 걸렸다면 백신이 다른 곳으로 격리시키는 상황이 왔다면, 읽으려는 파일이 원래 읽으려는 위치에 없을 수 있습니다.
  • 이런 경우 격리시킨 파일 이외에 나머지 파일은 이어서 읽을 수 있어야합니다.

2.예외가 발생하는 코드

  • 다음은 존재하지 않는 파일을 읽다가 예외가 발생하는 코드입니다.
  • b.txt파일이 작성된 적이 없어서 파일을 찾지 못해 예외가 발생합니다.
    static void Main(string[] args) 
    { 
    File.WriteAllText("a.txt", "hello A"); 
    File.WriteAllText("c.txt", "hello C"); 
    Console.WriteLine(File.ReadAllText("a.txt")); 
    Console.WriteLine(File.ReadAllText("b.txt")); 
    Console.WriteLine(File.ReadAllText("c.txt")); 
    }

실행결과

3.예외처리 - try-catch 구문 사용하기

  • C#에서는 예외 발생 시 별도로 처리가 필요합니다.
  • 파일을 읽을 때, 예외가 발생하는 경우 try-catch구문을 사용하여 예외처리 코드를 작성할 수 있습니다.
  • 파일이 없는 경우 예외 메시지를 반환하여 예외처리를 진행합니다.
class Program
{
    private static void safeRead(string filename)
    {
        try
        {
            Console.WriteLine(File.ReadAllText(filename));
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

    static void Main(string[] args)
    {
        File.WriteAllText("a.txt", "hello A");
        File.WriteAllText("c.txt", "hello C");
        safeRead("a.txt");
        safeRead("b.txt");
        safeRead("c.txt");

        Console.Read();
    }
}

실행결과

4. 예외처리 - File.Exists() 메서드

  • C#에서 예외가 발생하는 것 자체가 시스템에서 무거운 처리입니다.
  • 되도록 예외가 발생하는 상황을 피하는 것이 좋습니다.
  • 다음 예제는 예외 발생을 고려하지 않도록 하는 코드입니다.
  • 파일을 열기 전에 파일 유무를 판단하여, 파일이 있을 때만 파일을 엽니다.
class Program
{
    private static void safeRead(string filename)
    {
        if (File.Exists(filename))
            Console.WriteLine(File.ReadAllText(filename));
        else
            Console.WriteLine($"{filename}가 없습니다.");
    }
    static void Main(string[] args)
    {
        File.WriteAllText("a.txt", "hello A");
        File.WriteAllText("c.txt", "hello C");

        safeRead("a.txt");
        safeRead("b.txt");
        safeRead("c.txt");
    }

실행결과

5. 정리

  • File.Exists() : 예외처리 - File.Exists() 메서드예제에서 파일이 있는지 확인하는 처리와 파일을 여는 처리는 엄밀히 말하면 동시에 일어나지 않습니다. 따라서 예외가 발생할 수 있는 가능성이 있습니다.
  • try-catch를 사용하면 file.Exists()를 보완할 수 있으며, 예외처리 방식이 확실합니다. 하지만 예외가 많이 발생할수록 프로그램은 무거워지므로 File.Exists()를 사용하는게 좋을 수 있습니다.
  • 결론은 2가지 방법을 함께 사용하는 것이 가장 효율적인 방법입니다.