.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
C#中的异常处理(简单)一

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

     C#中的异常处理(简单)
  前言:Jon Jagger先生是一个经历丰富的人,写的文章简单而发人深省。大家可以到他的网站http://www.jaggersoft.com/上浏览一番,必然受益匪浅。这篇文章虽然比较简单,翻译当中难免出现错误,希望大家多多指教。
PS:这篇文章非常简单,如果你感觉到自己已经到达一定的水平,那么,请不要浪费时间了^_^
                 、令人痛苦的程式化错误处理
    异常还没出现前,处理错误最经典的方式就是使用错误代码检查语句了。例如
public sealed class Painful
    ... 
    private static char[] ReadSource(string filename)
    {
        FileInfo file = new FileInfo(filename);
        if (errorCode == 2342) goto handler;
        int length = (int)file.Length; 
        char[] source = new char[length];
        if (errorCode == -734) goto handler;
        TextReader reader = file.OpenText();
        if (errorCode == 2664) goto handler;
        reader.Read(source, 0, length);
        if (errorCode == -5227) goto handler;
        reader.Close();
        Process(filename, source);
        return source;
        handler:
        ...
    }
}
    这种编码方式单调乏味,翻来复去,难以使用,看起来非常的复杂,而且还使得基本功能很不清晰。并且还很容易忽略错误(故意或者偶尔的遗忘)。现在好了,有很多来处理这种情况,但是其中必有一些处理方式要好过其他的。
 
二、关系分离
    异常所能做到的最基本的事情就是允许你将错误和基本功能分离开来。换句话,我们能将上面的改写如下:
...
public sealed class PainLess
{   
    public static int Main(string[] args)
    {
        try
        {
           string filename = args[0];
           char[] source = ReadSource(filename);
           Process(filename, source);
           return 0;
        }
        catch (SecurityException    caught) { ... }
        catch (IOException          caught) { ... }
        catch (OutOfMemoryException caught) { ... }
        ...
    }
 
    private static char[] ReadSource(string filename)
    {
        FileInfo file = new FileInfo(filename);
        int length = (int)file.Length;
        char[] source = new char[length];
        TextReader reader = file.OpenText();
        reader.Read(source, 0, length);
        reader.Close();
        return source;
    }
}
在转化过程中,需要注意以下几点:
1.以前使用数字作为错误代码来描述错误(很失败的一种做法,谁知道2342是什么意思呢?),现在使用命名的异常类来描述(例如:SecurityException)。
2.异常类彼此之间的关系并没有紧密的联系在一起。相反的,用来描述某一类错误的整数代码在整个错误描述代码中必须是唯一。
3. 在ReadSource方法中没有没有抛出详细说明。在C#中抛出说明并不是必须的。
然而,最值得注意是:比较两段代码,ReadSource变得非常的清晰、简单、明了。它现在仅包含需要实现其基本功能的语句,没有表现出明显的错误处理。这是可以的,因为如果出现异常,调用堆栈就会自我展开。这个版本是我们想要的“理想”版本。
    然而,异常允许我们接近这个ReadSource的理想版本,同时,又阻止我们到达它。ReadSource是一个编码例子,它请求资源(一个TextReader),使用了资源(Read),并且释放了资源(Close)。问题是如果在请求资源的过程中出现了异常,那么资源将不会被释放。这个问题的解决是本文的一部分。不过,“理想“中的ReadSource版本仍然是有用的。我们将使用它做为下面几个版本的ReadSource评价的参照物。



相关文章

相关软件