文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
 websphere   .net framework
您现在的位置: IT文谷 >> 开发平台 >> .net framework >> ASP.NET >> 文章正文
ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用
ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用
ASP.NET中异常处理使用

ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用

  通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的。一个在C#中所引发的异常可以在Visual Basic客户中得到处理。不再有 HRESULTs  或者 ISupportErrorInfo 接口。
   尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理。你稍为改变编译器的溢出处理行为,接着有趣的事情就开始了:你处理了该异常。要增加更多的手段,随后引发你所创建的异常。
7.1  校验(checked)和非校验(unchecked)语句
   当你执行运算时,有可能会发生计算结果超出结果变量数据类型的有效范围。这种情况被称为溢出,依据不同的编程语言,你将被以某种方式通知--或者根本就没有被通知。(C++程序员听起来熟悉吗?)
    那么,C#如何处理溢出的呢? 要找出其默认行为,请看我在这本书前面提到的阶乘的例子。(为了方便其见,前面的例子再次在清单 7.1 中给出)

清单 7.1     计算一个数的阶乘

1: using System;
2:
3: class Factorial
4: {
5:  public static void Main(string&#; args)
6:  {
7:   long nFactorial = 1;
8:   long nComputeTo = Int64.Parse(args�);
9:
10:   long nCurDig = 1;
11:   for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
12:    nFactorial *= nCurDig;
13:
14:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
15:  }
16: }

   当你象这样使用命令行执行程序时
   factorial 2000

   结果为0,什么也没有发生。因此,设想C#默默地处理溢出情况而不明确地警告你是安全的。
    通过给整个应用程序(经编译器开关)或于语句级允许溢出校验,你就可以改变这种行为。以下两节分别解决一种方案。
7.1.1 给溢出校验设置编译器
   如果你想给整个应用程序控制溢出校验,C#编译器设置选择是正是你所要找的。默认地,溢出校验是禁用的。要明确地要求它,运行以下编译器命令:
csc factorial.cs /checked+

   现在当你用2000参数执行应用程序时,CLR通知你溢出异常(见图 7.1)。

图 7.1 允许了溢出异常,阶乘代码产生了一个异常。

  按OK键离开对话框揭示了异常信息:
Exception occurred: System.OverflowException
 at Factorial.Main(System.String&#;)

  现在你了解了溢出条件引发了一个 System.OverflowException异常。下一节,在我们完成语法校验之后,如何捕获并处理所出现的异常?
7.1.2 语法溢出校验
  如果你不想给整个应用程序允许溢出校验,仅给某些代码段允许校验,你可能会很舒适。对于这种场合,你可能象清单7.2中显示的那样,使用校验语句。

清单 7.2  阶乘计算中的溢出校验

1: using System;
2:
3: class Factorial
4: {
5:  public static void Main(string&#; args)
6:  {
7:   long nFactorial = 1;
8:   long nComputeTo = Int64.Parse(args&#0;);
9:
10:   long nCurDig = 1;
11:
12:   for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
13:    checked { nFactorial *= nCurDig; }
14:
15:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
16:  }
17: }

  甚至就如你运用标志 checked-编译了该代码,在第13行中,溢出校验仍然会对乘法实现检查。错误信息保持一致。

  显示相反行为的语句是非校验(unchecked )。甚至如果允许了溢出校验(给编译器加上checked+标志),被unchecked 语句所括住的代码也将不会引发溢出异常:

unchecked
{
nFactorial *= nCurDig;
}
 
   

7.2  异常处理语句
  既然你知道了如何产生一个异常(你会发现更多的方法,相信我),仍然存在如何处理它的问题。如果你是一个 C++ WIN32 程序员,肯定熟悉SEH(结构异常处理)。你将从中找到安慰,C#中的命令几乎是相同的,而且它们也以相似的方式运作。

The following three sections introduce C#'s exception-handling statements:
 以下三节介绍了C#的异常处理语句:

。用 try-catch 捕获异常
。用try-finally 清除异常
。用try-catch-finally 处理所有的异常

7.2.1  使用 try 和 catch捕获异常
  你肯定会对一件事非常感兴趣--不要提示给用户那令人讨厌的异常消息,以便你的应用程序继续执行。要这样,你必须捕获(处理)该异常。
   这样使用的语句是try 和 catch。try包含可能会产生异常的语句,而catch处理一个异常,如果有异常存在的话。清单7.3 用try 和 catch为OverflowException 实现异常处理。

  清单7.3  捕获由Factorial Calculation引发的OverflowException 异常

1: using System;
2:
3: class Factorial
4: {
5:  public static void Main(string&#; args)
6:  {
7:   long nFactorial = 1, nCurDig=1;
8:   long nComputeTo = Int64.Parse(args&#0;);
9:
10:   try
11:   {
12:    checked
13:    {
14:     for (;nCurDig <= nComputeTo; nCurDig++)
15: nFactorial *= nCurDig;
16:    }
17:   }
18:   catch (OverflowException oe)
19:   {
20:    Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);
21:    return;
22:   }
23:
24:   Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
25:  }
26: }

   为了说明清楚,我扩展了某些代码段,而且我也保证异常是由checked 语句产生的,甚至当你忘记了编译器设置时。
   正如你所见,异常处理并不麻烦。你所有要做的是:在try语句中包含容易产生异常的代码,接着捕获异常,该异常在这个例子中是OverflowException类型。无论一个异常什么时候被引发,在catch段里的代码会注意进行适当的处理。
   如果你不事先知道哪一种异常会被预期,而仍然想处于安全状态,简单地忽略异常的类型。

try
{
...
}
catch
{
...
}

   但是,通过这个途径,你不能获得对异常对象的访问,而该对象含有重要的出错信息。一般化异常处理代码象这样:

try
{
...
}
catch(System.Exception e)
{
...
}

   注意,你不能用ref或out 修饰符传递 e 对象给一个方法,也不能赋给它一个不同的值。

7.2.2  使用 try 和 finally 清除异常
   如果你更关心清除而不是错误处理, try 和 finally 会获得你的喜欢。它不仅抑制了出错消息,而且所有包含在 finally 块中的代码在异常被引发后仍然会被执行。
   尽管程序不正常终止,但你还可以为用户获取一条消息,如清单 7.4 所示。

   清单 7.4  在finally 语句中处理异常

1: using System;
2:
3: class Factorial
4: {
5:  public static void Main(string&#; args)
6:  {
7:   long nFactorial = 1, nCurDig=1;
8:   long nComputeTo = Int64.Parse(args&#0;);
9:   bool bAllFine = false;
10:
11:   try
12:   {
13:    checked
14:    {
15:     for (;nCurDig <= nComputeTo; nCurDig++)
16: nFactorial *= nCurDig;
17:    }
18:    bAllFine = true;
19:   }
20:   finally
21:   {
22:    if (!bAllFine)
23:     Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);
24:    else
25:     Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
26:   }
27:  }
28: }

[1] [2] 下一页  

[1] [2] 下一页  

ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用


  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    基于.NET的多线程编程入门
    Microsoft .NET 框架资源基础
    VS2005常用插件搜罗
    .net中用GDI+提高gif图片保存画质
    VS.NET:通过Web服务瞄准电子商务
    对象设计中创建VS使用
    安装/初始化/个性化DotNetNuke
    介绍dotnet原动力(DNN)
    GDI+编程10个基本技巧
    DTE .NET工程的自动化编译
    .Net中如何操作IIS的原理分析
    VS.NETRC5无法创建Add-IN工程
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 在本网BBS上发表言论者,文责自负。
    ③ 如您因版权等问题需要与本网联络,请在30日内联系 。
    ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用
    ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用2006-7-15ASP.NET中异常处理使用

    .net framework专题
    人气排行
  • 此栏目下没有文章
  • 最近更新
    普通文章技术介绍 新数据网格简介
    普通文章.NET 开发人员该下载的十个必备
    普通文章深入剖析Asp.net资源文件
    普通文章通过事例学习.net的WebForms技
    普通文章ASP.NET Tips1---合并多个字段
    普通文章微软明年1月份出台.NET专业开发
    普通文章微软下月底前完成Vista大部分功
    普通文章揭开微软 .NET 认证考试的面纱
    普通文章Visual Studio:Microsoft开发工
    普通文章Visual Studio:Microsoft开发工
    全站热点       
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷社区
    Tel: 0577-65690019    E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2006 wengu.org 文谷 All Rights Reserved
    浙ICP备05000327号