你是不是这样写异常处理代码的呢?

经常看到同事这样写代码:


代码如下:

DataSet QueryDB()
{
   DataSet ds=null;

try
    {
         //do something
    }
    catch (Exception ex)
    {
         //这里要做日志记录
    }

return ds;
}

这里有几个问题:

1:很明显,如果QueryDB方法发生了任何异常,客户端无法得知,例如客户端调用QueryDB方法,该方法返回了null,那这代表数据库里面没有这个数据呢?还是抛出了异常?

2:注释是不应该存在的,它应该被真实的日志记录代码给替代,例如Log.Write(ex);

3:该方法捕捉所有异常,这样任何异常都被捕获了,这对于开发很不方便,永远不要捕获你不能处理的异常。

4:为什么这样写代码??解释是:真实用户不希望看到错误信息,初听起来,好像有几分道理,试想没有哪个用户会用你的软件,然后老是抛出个异常什么的,但是这是部署之后的事情啊,而不是开发的程序员不希望看到异常啊。在开发的时候,如果能够看到详细的异常信息,那么可以很快的改正,修复Bug,何乐而不为之呢??

于是修改为如下:


代码如下:

DataSet QueryDB()
{
     DataSet ds = null;

try
     {
           //do something
     }
     catch (Exception ex)
     {
          Log.Write(ex);
          throw ex;
      }

return ds;
}

好了,现在异常总算被捕获了,并且也被成功了抛出来了。

这段代码还是有问题??

在catch语句块中,throw ex; 最好修改为throw;

因为在.net中,异常都是不可修改的,每一次异常被抛出的时候,异常的堆栈跟踪信息都会被重置,

Throw 不会重置堆栈跟踪信息,但是throw ex;会重置。所以为了更方便的查找异常的抛出位置,最好使用throw 语句,而不是throw ex;否则clr会认为异常是在catch语句块中抛出的。

顺便再说一句,不要捕获你不能处理的异常,如果希望将来用户看不到异常信息,

大可以使用AppDomain.或者Application的全局异常处理。

(0)

相关推荐

  • 你是不是这样写异常处理代码的呢?

    经常看到同事这样写代码: 复制代码 代码如下: DataSet QueryDB(){   DataSet ds=null; try    {         //do something    }    catch (Exception ex)    {          //这里要做日志记录    } return ds;} 这里有几个问题: 1:很明显,如果QueryDB方法发生了任何异常,客户端无法得知,例如客户端调用QueryDB方法,该方法返回了null,那这代表数据库里面没有这个数据

  • flask中主动抛出异常及统一异常处理代码示例

    本文主要介绍的是flask中主动抛出异常及统一异常处理的相关内容,具体如下. 在开发时,后台出现异常 ,但不想把异常显示给用户或者要统一处理异常时,可以使用abort主动抛出异常,再捕获异常返回美化后的页面. 主动抛出异常: @user.route('/testError') def testError(): print ('testError') abort(404) 使用装饰器errorhandler捕获异常: @user.errorhandler(404) def error(e): re

  • javascript中直接写php代码的方法

    一.在javascript中嵌入php代码javascript若是通过js文件包含进来的,那么js文件中也可以直接写php代码,只不过包含js文件是扩展名要改成php,如: 复制代码 代码如下: <script herf="js/demo.js.php"></script> 二.javascript函数参数的默认值c语言中可以通过这样来设置默认参数: 复制代码 代码如下: void foo(int a, int b = 1, bool c = false); 但

  • 浅谈时钟的生成(js手写简洁代码)

    在生成时钟的过程中自己想到布置表盘的写法由这么几种: 当然利用那种模式都可以实现,所以我们要用一个最好理解,代码有相对简便的方法实现 1.利用三角函数 用js在三角函数布置表盘的过程中有遇见到这种情况:是在表盘的刻度处,利用三角函数计算具体的值时不能得到整数,需要向上或者向下取整,这样无形中就会存在些许偏差,而且这样的偏差难利用样式来调整到位,即使最终效果都可以实现,但是细微处的缝隙和角度的偏差都会影响整体的视觉体验,作为一名程序开发人员,这样的视觉体验很难让别人认可,放弃. 2.利用遮罩层 j

  • 如何在wxml中直接写js代码(wxs)

    这篇文章主要介绍了如何在wxml中直接写js代码(wxs),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们在h5开发中,很多时候要在html中写到js代码,这个很容易实现.但是在微信小程序开发中,是不能直接在wxml中写js代码的,因此就有了wxs.在wxml中用wxs代码,有以下几种方式(在小程序文档中写的很清楚,我只不过是总结下) 第一种:直接在wxml文件中使用<wxs>标签 <wxs module="dateMod

  • springboot全局异常处理代码实例

    这篇文章主要介绍了springboot全局异常处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch,这样一个项目到最后会出现很多冗余的代码,使用全局异常处理避免过多冗余代码. 全局异常处理: 1.pom 依赖(延续上一章代码): <dependencies> <!-- Spring Boot Web 依赖 --> <!-- Web 依赖

  • Java基础异常处理代码及原理解析

    这篇文章主要介绍了java基础异常处理代码及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 异常的定义:中断了正常指令流的事件. try..catch..finally结构: class Test{ public static void main(String[] args){ System.out.println(1); try{ System.out.println(2); int i = 1 / 0; System.out.pri

  • Tensorflow卷积实现原理+手写python代码实现卷积教程

    从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象.本文以通俗易懂的方式讲述卷积,并辅以图片解释,能快速理解卷积的实现原理.最后手写python代码实现卷积过程,让Tensorflow卷积在我们面前不再是黑箱子! 注意: 本文只针对batch_size=1,padding='SAME',stride=[1,1,1,1]进行实验和解释,其他如果不是这个参数设置,原理也是一样. 1 Tensorflow卷积实现原理 先看一下卷积实现原理,对于

  • Python实现封装打包自己写的代码,被python import

    1.新建一个文件夹example,里面放入要打包的.py文件,以及必需的_init_.py. 代码如下: # -*- coding: utf-8 -*- """ Created on Thu Nov 1 17:04:02 2018 @author: Jo """ #!/usr/bin/env python #-*- coding:utf-8 -*- def run(): print ('This is a run package!') if __

  • 微软开源最强Python自动化神器Playwright(不用写一行代码)

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也需要一定的学习成本,对于一个纯小白来讲还是有些门槛的. 最近,微软开源了一个项目叫「playwright-python」,简直碉堡了!这个项目是针对Python语言的纯自动化工具,连代码都不用写,就能实现自动化功能. 可能你会觉得有点不可思议,但它就是这么厉害.下面我们一起看下这个神器. 1. Pl

随机推荐