`
tyny
  • 浏览: 74448 次
  • 性别: Icon_minigender_1
  • 来自: 黄冈
社区版块
存档分类
最新评论

C#异常传递

阅读更多

    无论写什么方面的程序,异常是不可避免的,而怎么处理涉及的东西则比较多,异常的处理方式,自己的理解分为两个方面的,一种是正常的业务异常,例如银行转帐时金额不够,这类错误一般会直接提示给用户;另一种是系统内部错误,例如银行转帐时,网络中断,这类错误同样也是需要提示给用户,但也是提示系统错误而已,不属于业务异常;无论那种错误,基本都会涉及到异常的捕捉处理和日志记录.现在的系统多属于分层的组件结构,异常更多的是在不同的组件之间传递,所以异常的捕捉和传递也相当重要,很少是由原始的异常发送的地方处理异常.
    .net的异常传递处理方式网上有很多规范可以使用,这里不涉及处理异常的顺序或者方式,主要对于异常的传递,典型的处理方式如下:

static void TestException1()
{
    try
    {
        DivideZero();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
 虽然是同一个异常,他会把异常信息传递给上层,但是会丢失异常真正的堆栈信息,他只会把异常的堆栈定义到当前抛出异常的地方;所以如果需要把原始的异常的堆栈信息抛给上层,则直接使用throw,而不需要任何特殊处理
static void TestException2()
{
    try
    {
        DivideZero();
    }
    catch//catch (Exception)
    {
        throw;
    }
}

    这是网上推荐的做法,实际上,他的确可以把底层的异常堆栈和异常抛给外层,但是在测试的时候,因为自己的不小心,这种方式还是有个小问题,只是平时很容易忽略掉,如果异常的真实发送地点正是在异常处理快里面,而不是异常处理快里面的函数里面,他也会丢失堆栈信息,这和throw ex处理方式没啥分别,具体原因还有待考证.

    测试源代码

namespace ExceptionDemo
{
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            Test(TestException1);
            Test(TestException2);
            Test(TestException3);
            Test(TestException4);
            Console.ReadLine();
        }

        static void Test( Action action)
        {
            try
            {
                action();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            Console.WriteLine();
        }

        static void TestException1()
        {
            try
            {
                DivideZero();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        static void TestException2()
        {
            try
            {
                DivideZero();
            }
            catch//catch (Exception)
            {
                throw;
            }
        }

        static void TestException3()
        {
            try
            {
                int a = 0;
                Console.WriteLine(10 / a);
            }
            catch
            {
                throw;
            }
        }

        static void TestException4()
        {
            try
            {
                DivideZero();
            }
            catch (Exception ex)
            {
                throw new Exception("处理出错", ex);
            }
        }

        static void DivideZero()
        {
            int a = 0;
            Console.WriteLine(10 / a);
        }
    }
}

 本地的输出,使用的是vs2008,.net3.5

 

    从上图的红色标记可以看到,即是使用throw,对于代码块里面直接抛出的异常,他一样会丢失相应的堆栈信息.这样看,还是包装一层要安全一点,但是具体原因还不是特别清楚.
 

  • 大小: 56.3 KB
分享到:
评论

相关推荐

    C# 语言规范 版本5.0中文.pdf

    异常处理 (exception handling) 提供了结构化和可扩展的错误检测和恢复方法;类 型安全 (type-safe) 的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型 强制转换等情形。 C# 具有一个...

    C# WebApi 异常处理解决方案

    前言:上篇C#进阶系列——WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理。关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP的时候,我们讲过通过AOP可以统一...

    C#调用C++DLL传递结构体数组的终极解决方案

    然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值压根没有改变过,代码如下。 [DllImport(workStation.dll)] private ...

    Visual C# 2010程序设计教程(教程PPT+源代码)

     《高等学校计算机应用规划教材:Visual C# 2010程序设计教程》详细介绍了Visual C# 2010程序设计的基础知识、基本方法和应用技巧,共分14章,主要内容包括.NET平台与Visual Studio 2010开发环境、C#语言基础及面向...

    C# 4.0语言规范

    因此,所有类型都共享一组通用操作,并且任何类型的值都能够以一致的方式进行存储、传递和操作。此外,C# 同时支持用户定义的引用类型和值类型,既允许对象的动态分配,也允许轻量结构的内联存储。 相对于C#3.0 ...

    C#利用Socket实现客户端之间直接通信

    C#利用Socket实现客户端之间直接通信 实验功能:  设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)...

    轻松学C#(图解版)

    《轻松学C#(图解版)》完整扫描版================================================================ 基本信息 作者:谷涛、扶晓、毕国锋 丛书名:轻松学开发 出版社:电子工业出版社 ISBN:978-7-121-20223-0 出版...

    C#语言规范4

    异常处理 (exception handling) 提供了结构化和可扩展的错误检测和恢复方法;类型安全 (type-safe) 的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型强制转换等情形。 C# 具有一个同一...

    Visual C# 2010程序设计教程PPT

    异常处理及try-catch-finally语句 第4章 数组与集合 数组的概念及定义 一维数组的使用 理解结合的概念及使用 常用的集合类 第5章 C#面向对象程序设计基础 面向对象程序设计的理念 类的概念...

    编写高质量代码之C#、C++_nodrm.azw3

    改善c#程序的157个建议》一共三个部分,第一部分专注于c#语言本身,一共89条建议,涵盖了c#语言基本要素、集合、linq、泛型、委托、事件、资源管理、序列化、异常处理、异步、多线程、任务和并行编程等与c#语法相关...

    C#微软培训资料

    8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...

    在一小时内学会 C#(txt版本)

    异常处理 ? .NET 库 编程结构 和 C++ 一样,C# 是大小写敏感的。半角分号(;)是语句分隔符。和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    Programming C#(第4版)(中文版)part2

    传递参数 88 重载方法和构造方法 94 用属性封装数据 97 只读字段 101 第5章 继承与多态 104 具体化与一般化 104 继承 107 多态 107 抽象类 115 万类之根:Object 119 类型的装箱和拆箱 121 嵌套类 124 第6章 操作符...

    北大青鸟C#复习总结

    北大青鸟S1阶段C#复习总结 一、基本语法 二、逻辑控制语句 三、格式字符串 冒泡排序 程序调试 六、注释: 七、 访问修饰符: 八、 属性: 九、 方法参数传递的类型: 十、 String类 十一、 异常处理 十二、 ADO.NET

    c#项目结束后的总结

    (3)c#中执行sql语句时传递参数的小经验 1> 直接写入法: 例如: int Id =1; string Name="lui"; cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')"; 因为Id是数值,所以在传递的时候只...

    CLR.via.C#.(中文第3版)(自制详细书签)

    CLR.via.C#.(中文第3版)(自制详细书签)Part2 CLR via C#(第3版) Jeffrey Richter 著 周靖 译 出版时间:2010年09月 页数:800 介绍 享有全球盛誉的编程专家Jeffrey Richter,这位与Microsoft .NET开发团队...

Global site tag (gtag.js) - Google Analytics