freeCodeCamp/guide/chinese/csharp/try-catch/index.md

108 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Try Catch Finally
localeTitle: 尝试抓住最后
---
# 尝试抓住最后
Try-Catch-Finally块用于避免破坏应用程序的未处理异常。当您的代码`throws`一个位于`try`部分之间的异常时,它将被捕获在语句的`catch`部分,您可以根据需要处理它。 `finally`语句总是在`finally`运行,通常用于清理非托管资源。您并不总是需要存在三个块,下面是有效选项。
* 的try-catch-最后
* 试着抓
* 尝试,最后
## 句法
```csharp
try
{
// Code which could potentially throw an exception
var parsedValue = Int32.Parse("abcde");
}
catch(Exception e)
{
// Code to handle the exception
Console.WriteLine("Exception: " + e.Message);
}
finally
{
// Code which will always run no matter what.
Console.WriteLine("Try-Catch block has finished execution");
}
```
在上面的例子中,我们试图将'abcde'转换为数值。此行将抛出异常,因为它无法成功转换为数字。 execption将被捕获到catch块中异常消息和其他详细信息将存储在catch块中指定的变量中上例中的字母“e”。完成所有这些后将执行“finally”部分以完成它。
## 尝试阻止
try块应放在可能与普通行为不同的代码周围并导致`Exception`并破坏您的应用程序。通过尝试阻止您可以保护自己免受致命的应用程序崩溃。重要的是要注意,一旦您的应用程序出现错误并抛出异常, `Try`块中的其余代码将**不会**被执行。
try块有自己的方法范围因此在try块内部无法访问try块内声明的任何变量。
```csharp
try
{
// Read user input from the console.
var userInput = Console.ReadLine();
}
catch(Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
//Outside the Try block
var parsedUserInput = Int32.Parse(userInput); // Not correct
```
以上将为您提供编译时错误,因为无法访问值'userInput'。如果需要访问try-catch块之外的变量则需要在try块之前声明变量。
```csharp
var userInput = "";
try
{
// Read user input from the console.
userInput = Console.ReadLine();
}
catch(Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
//Outside the Try block
var parsedUserInput = Int32.Parse(userInput); // Correct
```
## 抓住块
您可以在此块中指定要捕获的`Exception`类型。如果要捕获所有可能的异常,可以使用`Exception`基类。如果您只想捕获特定类型的异常,则可以指定该异常。其他异常类型的一些示例是`ArgumentException` `OutOfMemoryException`和`FormatException` 。
```csharp
try
{
var parsedValue = Int32.Parse("abcde");
}
// Only FormatExceptions will be caught in this catch block.
catch(FormatException exceptionVariable)
{
Console.WriteLine(exceptionVariable.Message);
}
```
在异常类型之后声明的变量将包含异常的所有数据,并且可以在`Catch`块中使用。
## 最后阻止
在`Try`和`Catch`块之后finally块**始终**在最后运行。无论是否抛出异常,此部分通常用于**必须**在最后发生的事情。 例如,假设我们需要一个变量,以便在它一直被操纵之后总是重新初始化为特定的数字。
```csharp
int initalValue = 12;
try
{
// Code which manipulates 'initialValue'
}
finally
{
Console.WriteLine("re-initalising value back to 12");
initialValue = 12;
}
```