ZetCode

C# IOException

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何在 C# 中处理 IOExceptions。

处理 I/O 经常会引起错误。.NET 在发生 I/O 错误时会抛出 I/O 异常。基本的 I/O 异常称为 IOException

还有几种更具体的 I/O 异常

这些都派生自基本的 IOException。 处理异常时,我们总是最后处理 IOException。 否则,将不会评估更具体的异常。

异常使用 try/catch 关键字处理。 我们的程序用户应获得易于理解的错误消息。 更多技术细节应留给管理员。 错误通常写入日志文件。

读取文件

根据文档,File.ReadAllText 方法打开一个文本文件,读取文件中的所有文本,然后关闭该文件。 此外,文档还列出了可能抛出的异常。

Program.cs
var filename = "words.txt";

var content = File.ReadAllText(filename);
Console.WriteLine(content);

该示例读取文本文件的内容。 如果未进行显式异常处理,则 .NET 会处理异常。

$ dotnet run
Unhandled exception. System.IO.FileNotFoundException: Could not find file ...

由于文件丢失,程序失败,并显示 System.IO.FileNotFoundException

try/catch 关键字

在下一个示例中,我们使用 try/catch 处理可能的错误。

Program.cs
var filename = "words.txt";

try
{
    var content = File.ReadAllText(filename);
    Console.WriteLine(content);
}
catch (FileNotFoundException e)
{
    Console.WriteLine("failed to read file");
    Console.WriteLine(e.Message);
}

异常处理的目标之一是向用户提供易于访问的错误消息。 他们不应为异常的技术细节所困扰。

$ dotnet run
failed to read file
Could not find file '/home/jano/Documents/prog/csharp/ioex/First/words.txt'.

这次我们有了一个更易读的错误消息。


Program.cs
var filename = "words.txt";

try
{
    var content = File.ReadAllText(filename);
    Console.WriteLine(content);
}
catch (FileNotFoundException e)
{
    Console.WriteLine("file was not found");
    Console.WriteLine(e.Message);
}
catch (IOException e)
{
    Console.WriteLine("IO error");
    Console.WriteLine(e.Message);
}

如果我们还捕获了基本的 IOException,则它必须遵循更具体的一个。

网络流

当我们读取和写入网络流时,可能会抛出 I/O 异常。

Program.cs
using System.Text;
using System.Net.Sockets;

using var client = new TcpClient();

var hostname = "webcode.me";
client.Connect(hostname, 80);

using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;

var message = @"GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: C# program
Connection: close
Host: webcode.me" + "\r\n\r\n";

using var reader = new StreamReader(networkStream, Encoding.UTF8);
byte[] bytes = Encoding.UTF8.GetBytes(message);

try
{
    networkStream.Write(bytes, 0, bytes.Length);
    Console.WriteLine(reader.ReadToEnd());
}
catch (IOException e)
{
    Console.WriteLine("GET request failed");
    Console.WriteLine(e.Message);
}

该示例创建一个对网页的 GET 请求。

try
{
    networkStream.Write(bytes, 0, bytes.Length);
    Console.WriteLine(reader.ReadToEnd());
}
catch (IOException e)
{
    Console.WriteLine("GET request failed");
    Console.WriteLine(e.Message);
}

网络流的 WriteReadToEnd 方法可能会抛出 I/O 异常。

来源

IOException 类 - 语言参考

在本文中,我们研究了 C# 中的 IOExceptions。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 至今,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程