百度蜘蛛不爬取网站,商务网站建设与维护 ppt,市住房城乡建设部网站,app和网站开发C# 异常
异常是为处理异常的发生而设计的#xff0c;这些特殊情况会改变程序执行的正常流程。 引发或引发异常。
在执行应用期间#xff0c;许多事情可能出错。 磁盘可能已满#xff0c;我们无法保存文件。 当我们的应用尝试连接到站点时#xff0c;Internet 连接可能会断…C# 异常
异常是为处理异常的发生而设计的这些特殊情况会改变程序执行的正常流程。 引发或引发异常。
在执行应用期间许多事情可能出错。 磁盘可能已满我们无法保存文件。 当我们的应用尝试连接到站点时Internet 连接可能会断开。 所有这些都可能导致我们的应用崩溃。 程序员有责任处理可以预期的错误。
trycatch和finally关键字用于处理异常。
Program.
using System;namespace DivisionByZero
{class Program{static void Main(string[] args){int x 100;int y 0;int z;try{z x / y;} catch (ArithmeticException e){Console.WriteLine(An exception occurred);Console.WriteLine(e.Message);}}}
}
在上面的程序中我们有意将数字除以零。 这会导致错误。
try
{z x / y;
}
容易出错的语句放置在try块中。 catch (ArithmeticException e)
{Console.WriteLine(An exception occurred);Console.WriteLine(e.Message);
}
异常类型跟随catch关键字。 在我们的情况下我们有一个ArithmeticException。 由于算术转换或转换操作中的错误而引发此异常。 发生错误时将执行catch关键字之后的语句。 发生异常时将创建一个异常对象。 从该对象中我们获得Message属性并将其打印到控制台。
$ dotnet run
An exception occurred
Attempted to divide by zero.
代码示例的输出。
C# 未捕获的异常
当前上下文中任何未捕获的异常都会传播到更高的上下文并寻找适当的 catch 块来处理它。 如果找不到任何合适的 catch 块则.NET 运行时的默认机制将终止整个程序的执行。
Program.
using System;namespace UcaughtException
{class Program{static void Main(string[] args){int x 100;int y 0;int z x / y;Console.WriteLine(z);}}
}
在此程序中我们除以零。 没有自定义异常处理。
$ dotnet runUnhandled Exception: System.DivideByZeroException: Division by zeroat UncaughtException.Main () [0x00000]
C# 编译器给出了以上错误消息。
C# IOException
发生 I / O 错误时将抛出IOException。 在下面的示例中我们读取文件的内容。
Program.
using System;
using System.IO;namespace ReadFile
{class Program{static void Main(string[] args){var fs new FileStream(langs.txt, FileMode.OpenOrCreate);try{var sr new StreamReader(fs);string line;while ((line sr.ReadLine()) ! null){Console.WriteLine(line);}}catch (IOException e){Console.WriteLine(IO Error);Console.WriteLine(e.Message);}finally{Console.WriteLine(Inside finally block);if (fs ! null){fs.Close();}}}}
}
始终执行finally关键字之后的语句。 它通常用于清理任务例如关闭文件或清除缓冲区。
} catch (IOException e)
{Console.WriteLine(IO Error);Console.WriteLine(e.Message);
}
在这种情况下我们捕获了特定的IOException异常。
} finally
{Console.WriteLine(Inside finally block);if (fs ! null) {fs.Close();}
}
这些行确保关闭文件处理程序。
$ cat langs.txt
C#
Java
Python
Ruby
PHP
JavaScript
这些是langs.txt文件的内容。
$ dotnet run
C#
Java
Python
Ruby
PHP
JavaScript
Inside finally block
这是程序的输出。
我们使用 cat 命令和程序输出显示 langs 文件的内容。
C# 多个异常
我们经常需要处理多个异常。
Program.
using System;
using System.IO;namespace MultipleExceptions
{class Program{static void Main(string[] args){int x;int y;double z;try{Console.Write(Enter first number: );x Convert.ToInt32(Console.ReadLine());Console.Write(Enter second number: );y Convert.ToInt32(Console.ReadLine());z x / y;Console.WriteLine(Result: {0:N} / {1:N} {2:N}, x, y, z);}catch (DivideByZeroException e){Console.WriteLine(Cannot divide by zero);Console.WriteLine(e.Message);}catch (FormatException e){Console.WriteLine(Wrong format of number.);Console.WriteLine(e.Message);}}}
}
在此示例中我们捕获了各种异常。 请注意更具体的异常应先于一般的异常。 我们从控制台读取两个数字并检查零除错误和数字格式错误。
$ dotnet run
Enter first number: we
Wrong format of number.
Input string was not in a correct format.
运行示例我们得到了这个结果。
C# 自定义异常
定制异常是从System.Exception类派生的用户定义的异常类。
Program.
using System;namespace CustomException
{class BigValueException : Exception{public BigValueException(string msg) : base(msg) { }}class Program{static void Main(string[] args){int x 340004;const int LIMIT 333;try{if (x LIMIT){throw new BigValueException(Exceeded the maximum value);}}catch (BigValueException e){Console.WriteLine(e.Message);}}}
}
我们假定存在无法处理大量数字的情况。
class BigValueException : Exception我们有一个BigValueException类。 该类派生自内置的Exception类。
const int LIMIT 333;大于此常数的数字在我们的程序中被视为“大”。
public BigValueException(string msg) : base(msg) {}在构造函数内部我们称为父级的构造函数。 我们将消息传递给父母。
if (x LIMIT)
{throw new BigValueException(Exceeded the maximum value);
}
如果该值大于限制则抛出自定义异常。 我们给异常消息“超出最大值”。
} catch (BigValueException e)
{Console.WriteLine(e.Message);
}
我们捕获到异常并将其消息打印到控制台。
$ dotnet run
Exceeded the maximum value