在本文中,我们展示了如何在C#中使用IOExceptions。
使用IO经常会导致错误。.NET在发生IO错误时抛出IO异常。基本IO异常称为IOException
。
还有其他几个更具体的IO异常:
- FileNotFoundException
- DirectoryNotFoundException
- DriveNotFoundException
- PathTooLongException
- OperationCanceledException
这些是从基础IOException
派生的。在处理异常时,我们总是最后处理IOException
。否则,将不会评估更具体的异常。
异常是用try/catch
关键字处理的。我们程序的用户应该看到易于理解的错误消息。更多技术细节将保留给管理员。错误通常会写入日志文件。
读取文件
根据文档,File.ReadAllText
方法打开一个文本文件,读取文件中的所有文本,然后关闭文件。文档还列出了可能抛出的异常。
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
处理可能的错误。
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'.
这次我们有一个更易读的错误消息。
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
,它必须跟在更具体的异常之后。
网络流
当我们读写网络流时,会抛出IO异常。
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); }
网络流Write
和ReadToEnd
方法可能抛出IO异常。
在本文中,我们使用了C#中的IOExceptions。
列出所有C#教程。