`
tyny
  • 浏览: 75768 次
  • 性别: 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#异常处理的技巧和方法

    本文将深入探讨C#异常处理的技巧和方法,以及相关的知识点。 首先,我们来看C#中的异常处理结构,它主要由`try`、`catch`和`finally`三个关键字组成。`try`块用于包含可能抛出异常的代码,`catch`块用于捕获并处理...

    C# .net Aop 动态截获异常

    4. **绑定上下文**:为了在异常处理逻辑中获取到更多的上下文信息(如用户信息、请求信息等),可以使用依赖注入来传递这些信息,或者使用静态类、ThreadLocal等存储全局状态。 5. **反射技术**:在某些情况下,...

    C#异常处理

    ### C#异常处理详解 #### 一、异常处理机制概述 异常处理是现代编程语言中一个重要的组成部分,它能够帮助开发者有效地处理程序运行时出现的各种意外情况,避免程序崩溃,提高程序的健壮性和用户体验。在C#中,...

    C#中的异常

    在C#编程语言中,异常处理是至关重要的一个部分,它允许程序员优雅地处理程序运行时可能出现的问题,防止程序因错误而突然崩溃。异常(Exception)是程序执行期间出现的错误,可以是语法错误、逻辑错误或者是外部...

    c# 自定义异常 Exception

    在抛出自定义异常时,通常使用`throw`语句,确保正确传递异常信息: ```csharp try { // 操作可能导致异常的部分 throw new DatabaseConnectionException("Data Source=.;Initial Catalog=MyDB;Integrated ...

    C#教你使用异常处理

    ### C#异常处理的关键字 C#提供了几个重要的关键字来处理异常: - **try**:此关键字用于标记可能引发异常的代码块。当try块中的代码引发异常时,控制将传递给与之相关的catch块。 - **catch**:用于捕获并处理try...

    C# 多线程 参数传递 示例

    以下是关于"C# 多线程 参数传递 示例"的详细说明。 首先,让我们理解什么是多线程。线程是操作系统分配CPU时间的基本单元,一个进程可以有多个线程。在C#中,`System.Threading`命名空间提供了对线程操作的支持。...

    C#控制台程序之间参数传递

    在C#编程中,控制台程序之间的参数传递是一项常见的任务,尤其在系统集成或脚本自动化等场景下。...在实际应用中,记得确保正确处理异常情况,例如当没有参数传递或参数不符合预期格式时,应给出适当的错误提示。

    asp.net(C#)异常课件

    如果没有匹配的`catch`块,异常将被传递到调用堆栈的上一层,直到找到合适的处理程序或者导致程序终止。 例如,当用户尝试输入非数字字符串并试图转换为整数时,`int.Parse()`方法会抛出`FormatException`。因此,...

    c# 窗口间传递数据

    在C#编程中,窗口间的数据传递是一个常见的需求,特别是在设计多窗口或多视图的应用程序时。本文将深入探讨如何利用C#的委托机制来实现在不同窗口间有效地传递数据,同时也考虑到在多线程环境下的应用。 首先,我们...

    C#调用C++的dll实例,回调函数,string和int数组参数传递

    8. **异常处理**:由于C++和C#的异常处理机制不同,建议在C#的P/Invoke调用中使用`try-catch`来捕获可能出现的异常。 总的来说,C#调用C++ DLL涉及到接口定义、数据类型的映射、P/Invoke调用以及内存管理等多个方面...

    C#异常处理总结及简单实例

    * System.ArgumentNullException 当将空引用传递给不接受它作为有效参数的方法时引发的异常。 * System.ArgumentOutOfRangeException 当参数值超出调用的方法所定义的允许取值范围时引发的异常。 3. 由 System....

    C#异常处理与调试视频讲解

    总结来说,"C#异常处理与调试视频讲解"涵盖了在C#编程中如何优雅地处理错误,以及如何有效地找出并解决这些问题。通过学习这些知识,开发者可以提高代码质量,减少程序的不稳定因素,从而提升用户体验。

    C#调用C++动态链接库,函数为地址传递

    - **异常处理**:C#调用DLL时可能会遇到异常,如找不到DLL、未处理的异常等,需要适当捕获和处理。 通过以上步骤,我们可以实现C#调用C++动态链接库,并传递结构体地址作为参数的功能。这种技术广泛应用于游戏开发...

    dll向C#传递数组.rar

    本示例“dll向C#传递数组.rar”提供了如何在C#中调用C++编写的DLL,并传递数组作为参数的具体方法。这种跨语言互操作性依赖于CLI(Common Language Infrastructure)标准,特别是P/Invoke(Platform Invoke)机制。 ...

    C#062异常处理

    如果所有的`catch`块都不匹配,那么这个异常将会被传递到上一级调用栈,直到找到合适的处理程序或者导致程序终止。 除了`catch`,还可以使用`finally`块来执行一些必须的清理操作,无论是否发生异常都会执行。例如...

    C#中的异常处理

    后者常用于捕获一个异常,但又希望将其传递给上一级调用者处理。 ```csharp throw new ArgumentException("Invalid argument."); // 或者 try { // ... } catch (Exception ex) { // 处理或记录异常 throw; // ...

    C# 通过以太网传递图片

    本文将深入探讨如何使用C#通过以太网进行图片的传递,以及接收并显示这些图片。首先,我们需要理解以太网的基础知识,然后介绍C#中的网络编程接口,最后通过一个实例来演示图片的发送与接收。 以太网是局域网(LAN...

    c# 异常处理

    如果没有匹配的`catch`块,异常会被传递到上一级的`try`/`catch`结构,直至找到合适的处理者,或最终导致程序退出。 `finally`块是一个可选部分,无论是否发生异常,`finally`块内的代码都将被执行,通常用于清理...

    c#整合zeroIce - 传递复杂对象

    5. **异常处理**: 当服务方法抛出异常时,ZeroIce会将这些异常封装并传递给客户端,以便客户端能捕获并处理。 通过以上步骤,你可以在C#项目中成功集成ZeroIce并传递复杂对象。这个框架使得分布式系统的设计变得...

Global site tag (gtag.js) - Google Analytics