一个简单的问题 捕获异常,执行clean up代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是用来做异常处理的。比如try{ 如正确 .......;}catch{ 出错时 ........;} try { // 可能会throw出异常的若干语句} catch (/* 被throw出异常 */) { // 捕捉上面语句throw出的异常,并处理} finally { // 不管有没有异常发生都必须做的语句} 不然的话你的程序会把使用它的人吓死,而且根本不能正常运行,当然,如果你的程序不是完美无缺到任何bug都没有的话 try-catch 语句由一个 try 块和其后所跟的一个或多个 catch 子句(为不同的异常指定处理程序)构成。此语句会采用下列形式之一:try try-block catch (exception-declaration-1) catch-block-1 catch (exception-declaration-2) catch-block-2 ...try try-block catch catch-block其中: try-block 包含应引发异常的代码段。 exception-declaration, exception-declaration-1, exception-declaration-2 异常对象声明。 catch-block, catch-block-1, catch-block-2 包含异常处理程序。 备注try-block 包含可能导致异常的保护代码块。该块一直执行到引发异常或成功完成为止。例如,下列转换 null 对象的尝试引发 NullReferenceException 异常:object o2 = null;try{ int i2 = (int) o2; // Error}catch 子句使用时可以不带任何参数,在这种情况下它捕获任何类型的异常,并被称为一般 catch 子句。它还可以采用从 System.Exception 派生的对象参数,在这种情况下它处理特定的异常。例如:catch (InvalidCastException e) {}在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。在 catch 块中可以使用 throw 语句再次引发已由 catch 语句捕获的异常。例如:catch (InvalidCastException e) { throw (e); // Rethrowing exception e}如果要再次引发当前由无参数的 catch 子句处理的异常,则使用不带参数的 throw 语句。例如:catch{ throw;}请在 try 块内部只初始化其中声明的变量;否则,完成该块的执行前可能发生异常。例如,在下面的代码示例中,变量 x 在 try 块内初始化。试图在 Write(x) 语句中的 try 块外部使用此变量时将生成编译器错误:使用了未赋值的局部变量。public static void Main() { int x; try { x = 123; // Don't do that. // ... } catch { // ... } Console.Write(x); // Error: Use of unassigned local variable 'x'.}有关 catch 的更多信息,请参见 try-catch-finally。示例在此例中,try 块包含对可能导致异常的 MyFn() 方法的调用。catch 子句包含仅在屏幕上显示消息的异常处理程序。当从 MyFn() 内部调用 throw 语句时,系统查找 catch 语句并显示 Exception caught 消息。// Rethrowing exceptions:using System;class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } catch (Exception e) { Console.WriteLine("{0} Exception caught.", e); } } public void MyFn(string s) { if (s == null) throw(new ArgumentNullException()); } }输出发生以下异常:System.ArgumentNullException示例此例使用了两个 catch 语句。最先出现的最特定的异常被捕获。// Ordering catch clausesusing System;class MyClass { public static void Main() { MyClass x = new MyClass(); try { string s = null; x.MyFn(s); } // Most specific: catch (ArgumentNullException e) { Console.WriteLine("{0} First exception caught.", e); } // Least specific: catch (Exception e) { Console.WriteLine("{0} Second exception caught.", e); } } public void MyFn(string s) { if (s == null) throw new ArgumentNullException(); } }输出发生以下异常:System.ArgumentNullException在前面的示例中,如果从特定程度最小的 catch 子句开始,您将收到此错误信息:A previous catch clause already catches all exceptions of this or a super type ('System.Exception')但是,若要捕获特定程度最小的异常,请使用下面的语句替换 throw 语句:throw new Exception(); try-finally请参见C# 关键字 | 与 C++ 比较 | 异常处理语句 | throw | try-catch | 引发异常 | C. 语法finally 块用于清除在 try 块中分配的任何资源。控制总是传递给 finally 块,与 try 块的存在方式无关。此语句的形式如下:try try-block finally finally-block其中: try-block 包含应引发异常的代码段。 finally-block 包含异常处理程序和清理代码。 备注catch 用于处理语句块中出现的异常,而 finally 用于保证代码语句块的执行,与前面的 try 块的执行方式无关。示例在此例中,有一个导致异常的无效转换语句。当运行程序时,您收到一条运行时错误信息,但 finally 子句仍继续执行并显示输出。// try-finallyusing System;public class TestTryFinally { public static void Main() { int i = 123; string s = "Some string"; object o = s; try { // Invalid conversion; o contains a string not an int i = (int) o; } finally { Console.Write("i = {0}", i); } }}输出发生以下异常:System.InvalidCastException尽管捕捉了异常,但仍会执行包括在 finally 块中的输出语句,即:i = 123有关 finally 块的更多信息,请参见 try-catch-finally。 try-catch-finally请参见C# 关键字 | 与 C++ 比较 | 异常处理语句 | throw | 引发异常 | C. 语法一起使用 catch 和 finally 的通常用法是在 try 块中获取并使用资源,在 catch 块中处理异常情况,在 finally 块中释放资源。示例// try-catch-finallyusing System;public class EHClass { public static void Main () { try { Console.WriteLine("Executing the try statement."); throw new NullReferenceException(); } catch(NullReferenceException e) { Console.WriteLine("{0} Caught exception #1.", e); } catch { Console.WriteLine("Caught exception #2."); } finally { Console.WriteLine("Executing finally block."); } }}输出Executing the try statement.System.NullReferenceException: Attempted to dereference a null object reference. at EHClass.Main() Caught exception #1.Executing finally block. 什么原因能让一个构造出来里的类,与原构造者里的对象断了关系? panel边框大小和颜色可以改变么? 水印 C#下的一个字符串拆分问题 讨论case和if语句的区别 求助,请问这是什么原因?谢谢 求高手请教定义数组 sQL数据库连接 关于.resx? 请问在C#的ASP。NET网站中没有有哪个控件可以即输入文本信息,又可粘贴图象? 怎么控制DataGrid的列的宽度? 我的“帮助信息”,没有了,怎么回事呀? 没分了,也请问一下TreeNode是否被选中???
try
{
如正确
.......;
}
catch
{
出错时
........;
}
// 可能会throw出异常的若干语句
} catch (/* 被throw出异常 */) {
// 捕捉上面语句throw出的异常,并处理
} finally {
// 不管有没有异常发生都必须做的语句
}
try try-block
catch (exception-declaration-1) catch-block-1
catch (exception-declaration-2) catch-block-2
...
try try-block catch catch-block
其中:
try-block
包含应引发异常的代码段。
exception-declaration, exception-declaration-1, exception-declaration-2
异常对象声明。
catch-block, catch-block-1, catch-block-2
包含异常处理程序。
备注
try-block 包含可能导致异常的保护代码块。该块一直执行到引发异常或成功完成为止。例如,下列转换 null 对象的尝试引发 NullReferenceException 异常:
object o2 = null;
try
{
int i2 = (int) o2; // Error
}
catch 子句使用时可以不带任何参数,在这种情况下它捕获任何类型的异常,并被称为一般 catch 子句。它还可以采用从 System.Exception 派生的对象参数,在这种情况下它处理特定的异常。例如:
catch (InvalidCastException e)
{
}
在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。
在 catch 块中可以使用 throw 语句再次引发已由 catch 语句捕获的异常。例如:
catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
}
如果要再次引发当前由无参数的 catch 子句处理的异常,则使用不带参数的 throw 语句。例如:
catch
{
throw;
}
请在 try 块内部只初始化其中声明的变量;否则,完成该块的执行前可能发生异常。例如,在下面的代码示例中,变量 x 在 try 块内初始化。试图在 Write(x) 语句中的 try 块外部使用此变量时将生成编译器错误:使用了未赋值的局部变量。
public static void Main()
{
int x;
try
{
x = 123; // Don't do that.
// ...
}
catch
{
// ...
}
Console.Write(x); // Error: Use of unassigned local variable 'x'.
}
有关 catch 的更多信息,请参见 try-catch-finally。
示例
在此例中,try 块包含对可能导致异常的 MyFn() 方法的调用。catch 子句包含仅在屏幕上显示消息的异常处理程序。当从 MyFn() 内部调用 throw 语句时,系统查找 catch 语句并显示 Exception caught 消息。
// Rethrowing exceptions:
using System;
class MyClass
{
public static void Main()
{
MyClass x = new MyClass();
try
{
string s = null;
x.MyFn(s);
} catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
} public void MyFn(string s)
{
if (s == null)
throw(new ArgumentNullException());
}
}
输出
发生以下异常:
System.ArgumentNullException
示例
此例使用了两个 catch 语句。最先出现的最特定的异常被捕获。
// Ordering catch clauses
using System;
class MyClass
{
public static void Main()
{
MyClass x = new MyClass();
try
{
string s = null;
x.MyFn(s);
} // Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
} // Least specific:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
} } public void MyFn(string s)
{
if (s == null)
throw new ArgumentNullException();
}
}
输出
发生以下异常:
System.ArgumentNullException
在前面的示例中,如果从特定程度最小的 catch 子句开始,您将收到此错误信息:
A previous catch clause already catches all exceptions of this or a super type ('System.Exception')
但是,若要捕获特定程度最小的异常,请使用下面的语句替换 throw 语句:
throw new Exception();
C# 关键字 | 与 C++ 比较 | 异常处理语句 | throw | try-catch | 引发异常 | C. 语法
finally 块用于清除在 try 块中分配的任何资源。控制总是传递给 finally 块,与 try 块的存在方式无关。此语句的形式如下:try try-block finally finally-block
其中: try-block
包含应引发异常的代码段。
finally-block
包含异常处理程序和清理代码。
备注
catch 用于处理语句块中出现的异常,而 finally 用于保证代码语句块的执行,与前面的 try 块的执行方式无关。示例
在此例中,有一个导致异常的无效转换语句。当运行程序时,您收到一条运行时错误信息,但 finally 子句仍继续执行并显示输出。// try-finally
using System;
public class TestTryFinally
{
public static void Main()
{
int i = 123;
string s = "Some string";
object o = s; try
{
// Invalid conversion; o contains a string not an int
i = (int) o;
} finally
{
Console.Write("i = {0}", i);
}
}
}
输出
发生以下异常:System.InvalidCastException
尽管捕捉了异常,但仍会执行包括在 finally 块中的输出语句,即:i = 123
有关 finally 块的更多信息,请参见 try-catch-finally。
C# 关键字 | 与 C++ 比较 | 异常处理语句 | throw | 引发异常 | C. 语法一起使用 catch 和 finally 的通常用法是在 try 块中获取并使用资源,在 catch 块中处理异常情况,在 finally 块中释放资源。
示例
// try-catch-finally
using System;
public class EHClass
{
public static void Main ()
{
try
{
Console.WriteLine("Executing the try statement.");
throw new NullReferenceException();
} catch(NullReferenceException e)
{
Console.WriteLine("{0} Caught exception #1.", e);
} catch
{
Console.WriteLine("Caught exception #2.");
} finally
{
Console.WriteLine("Executing finally block.");
}
}
}
输出
Executing the try statement.
System.NullReferenceException: Attempted to dereference a null object reference.
at EHClass.Main() Caught exception #1.
Executing finally block.