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가지 방법을 함께 사용하는 것이 가장 효율적인 방법입니다.
'프로그래밍 > (도서)C#코딩의기술-실전' 카테고리의 다른 글
[C#] 코딩의기술(실전편) - 2.3 Format 메서드 (0) | 2022.03.31 |
---|---|
[C#] 코딩의기술(실전편) - 2.2 변화하는 조건 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.6 강제 종료 처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.5 비동기 처리 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 1.4 병렬처리 (0) | 2022.03.31 |