菜鸟求助

cxchaoqiang 2009-04-09 01:56:46
我是一个c#新手,现在对c#异常处理中的try catch finally 用法不是很理解 希望有高手来指点迷津
(有实例就更好啦)
...全文
103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaohenggaoheng 2009-04-09
  • 打赏
  • 举报
回复
try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。引发异常时,公共语言运行时 (CLR) 会查找处理此异常的 catch 语句。如果当前执行的方法不包含这样的 catch 块,则 CLR 会查看调用当前方法的方法,然后会遍历调用堆栈。如果找不到 catch 块,则 CLR 会向用户显示一条有关未处理异常的消息并停止执行程序。

try 块包含可能导致异常的保护代码。该块一直执行到引发异常或成功完成为止。例如,下列强制转换 null 对象的尝试引发 NullReferenceException 异常:

object o2 = null;
try
{
int i2 = (int)o2; // Error
}
虽然可以使用不带参数的 catch 子句捕捉任何类型的异常,但不推荐这种用法。通常,您应该只捕捉那些您知道如何从中恢复的异常。因此,应该总是指定一个从 System.Exception 派生的对象参数。例如:

catch (InvalidCastException e)
{
}
在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。

在 catch 块中可以使用 throw 语句再次引发已由 catch 语句捕获的异常。例如:

catch (InvalidCastException e)
{
throw (e); // Rethrowing exception e
}
您也可以引发新的异常。此时,请将捕捉的异常指定为内部异常:

catch (InvalidCastException e)
{
// Can do cleanup work here.
throw new CustomException("Error message here.", e);
}
如果要再次引发当前由无参数的 catch 子句处理的异常,则使用不带参数的 throw 语句。例如:

catch
{
throw;
}
在 try 块内部时应该只初始化其中声明的变量;否则,完成该块的执行前可能发生异常。例如,在下面的代码示例中,变量 x 在 try 块内初始化。试图在 Write(x) 语句中的 try 块外部使用此变量时将产生编译器错误:使用了未赋值的局部变量。

static void Main()
{
int x;
try
{
// Don't initialize this variable here.
x = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'x'.
Console.Write(x);
}
有关 catch 的更多信息,请参见 try-catch-finally。

示例
在此例中,try 块包含对可能导致异常的 ProcessString 方法的调用。catch 子句包含仅在屏幕上显示消息的异常处理程序。当从 MyMethod 内部调用 throw 语句时,系统查找 catch 语句并显示 Exception caught 消息。

C#
class TryFinallyTest
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}

static void Main()
{
string s = null; // For demonstration purposes.

try
{
ProcessString(s);
}

catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}
/*
Output:
System.ArgumentNullException: Value cannot be null.
at TryFinallyTest.Main() Exception caught.
* */


此例使用了两个 catch 语句。最先出现的最特定的异常被捕获。

C#
class ThrowTest3
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}

static void Main()
{
try
{
string s = null;
ProcessString(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);
}
}
}
/*
Output:
System.ArgumentNullException: Value cannot be null.
at TryFinallyTest.Main() First exception caught.
*/
caorenlong 2009-04-09
  • 打赏
  • 举报
回复
楼上的都对
路人乙e 2009-04-09
  • 打赏
  • 举报
回复
try
{
//执行代码(可能出错)
}
catch
{
//捕捉错误
}
finally
{
//必执行代码块(当在catch块抛出异常的时候照样执行该代码块)
}
柳晛 2009-04-09
  • 打赏
  • 举报
回复

int 结果 = 0,
被除数 = 1,
除数 = 0;
try
{
结果 = 被除数 / 除数;
}
catch
{
messagebox.show(" 0 不能做除数!");
}
finally
{
除数 = 0; // 无论是否发生异常,都执行 finally 中的语句。
}
柳晛 2009-04-09
  • 打赏
  • 举报
回复

int 结果 = 0,
被除数 = 1,
除数 = 0;
try
{
i = 被除数 / 除数;
}
catch
{
messagebox.show(" 0 不能做除数!");
}
finally
{
除数 = 0; // 无论是否发生异常,都执行 finally 中的语句。
}
myrroom 2009-04-09
  • 打赏
  • 举报
回复
我一直是这样理解的,也是这样用的。不知道对不对,听说这个语句特别的有用哦

try
{
//想要要执行的代码(没有异常的时候执行)
}
catch
{
//发生异常是执行的代码(一般调试的时候,异常信息会用一个messagebox给show出来。
// 或者将信息传到接近表示层的类中去处理了再逐层的传递到表层给用户提示出来)
}
finally

{
//不管有没有异常最终都要执行的代码
}

下面是一个例子

#region 执行存储过程的方法RunExecuteScalar()
/// <summary>
/// 执行存储过程的方法RunExecuteScalar()
/// </summary>
/// <param name="ProcName">要执行的存储过程的名称</param>
/// <param name="Prams">存储过程的参数</param>
/// <returns>返回首行首列string型</returns>
public string RunExecuteScalar(string ProcName,SqlParameter[] Prams)
{
CheckSqlConnection();//调用检测SQL Server连接是否打开,若没有打开则打开的方法
try
{
SqlCommand Comm = ReturnSQLCommand(ProcName, Prams);
string StrResult = Convert.ToString(Comm.ExecuteScalar());
return StrResult;
}
catch(Exception ex)
{
throw new Exception(ex.Message); //捕获异常,并抛出
}
finally
{
CheckSqlConnectionOpen(); //关闭SQL连接
}
}
#endregion
zhizlm 2009-04-09
  • 打赏
  • 举报
回复
一般在网络连接方面使用。给你讲下
try
{
有可能出现错误的句子,屏蔽掉错误,跳到catch
}
catch
{
messagebox.show("错啦")
}
finally

{
最后就执行这个吧。
}
zhizlm 2009-04-09
  • 打赏
  • 举报
回复
一般在网络连接方面使用。给你讲下
try
{
有可能出现错误的句子,屏蔽掉错误,跳到catch
}
catch
{
messagebox.show("错啦")
}
finally

{
最后就执行这个吧。
}

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧