首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在C#中捕获后却重新抛出了异常?

为什么在C#中捕获后却重新抛出了异常?

提问于 2017-12-13 02:40:38
回答 2关注 0查看 772

我正在看可序列化DTO 上的文章C# - 数据传输对象。

文章包含这段代码:

代码语言:txt
AI代码解释
复制
public static string SerializeDTO(DTO dto) {
代码语言:txt
AI代码解释
复制
    try {
代码语言:txt
AI代码解释
复制
        XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
代码语言:txt
AI代码解释
复制
        StringWriter sWriter = new StringWriter();
代码语言:txt
AI代码解释
复制
        xmlSer.Serialize(sWriter, dto);
代码语言:txt
AI代码解释
复制
        return sWriter.ToString();
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
    catch(Exception ex) {
代码语言:txt
AI代码解释
复制
        throw ex;
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

本文的其余部分看起来非常合理,但是try-catch-throw会抛出WtfException ... 这不完全等同于不处理异常吗?

人机工程学:

代码语言:txt
AI代码解释
复制
public static string SerializeDTO(DTO dto) {
代码语言:txt
AI代码解释
复制
    XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
代码语言:txt
AI代码解释
复制
    StringWriter sWriter = new StringWriter();
代码语言:txt
AI代码解释
复制
    xmlSer.Serialize(sWriter, dto);
代码语言:txt
AI代码解释
复制
    return sWriter.ToString();
代码语言:txt
AI代码解释
复制
}

或者我错过了C#中的错误处理的基本知识?它几乎与Java相同(减去检查的异常),不是吗?...也就是说,他们都提炼了C ++。

堆栈溢出问题重新抛出无参数捕获和不做任何事情之间的区别?似乎支持我的观点,即尝试抛出是无效的。

编辑:

只是为了总结任何未来发现这个线程的人...

不要

代码语言:txt
AI代码解释
复制
try {
代码语言:txt
AI代码解释
复制
    // Do stuff that might throw an exception
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch (Exception e) {
代码语言:txt
AI代码解释
复制
    throw e; // This destroys the strack trace information!
代码语言:txt
AI代码解释
复制
}

堆栈跟踪信息对于确定问题的根本原因至关重要!

代码语言:txt
AI代码解释
复制
try {
代码语言:txt
AI代码解释
复制
    // Do stuff that might throw an exception
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch (SqlException e) {
代码语言:txt
AI代码解释
复制
    // Log it
代码语言:txt
AI代码解释
复制
    if (e.ErrorCode != NO_ROW_ERROR) { // filter out NoDataFound.
代码语言:txt
AI代码解释
复制
        // Do special cleanup, like maybe closing the "dirty" database connection.
代码语言:txt
AI代码解释
复制
        throw; // This preserves the stack trace
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch (IOException e) {
代码语言:txt
AI代码解释
复制
    // Log it
代码语言:txt
AI代码解释
复制
    throw;
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch (Exception e) {
代码语言:txt
AI代码解释
复制
    // Log it
代码语言:txt
AI代码解释
复制
    throw new DAOException("Excrement occurred", e); // wrapped & chained exceptions (just like java).
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
finally {
代码语言:txt
AI代码解释
复制
    // Normal clean goes here (like closing open files).
代码语言:txt
AI代码解释
复制
}

在更具体的例外之前抓住更具体的例外(就像Java一样)。

回答 2

秋之夕颜清

发布于 2017-12-13 04:25:48

不要这样做,

代码语言:txt
AI代码解释
复制
try 
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
...
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch(Exception ex)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
   throw ex;
代码语言:txt
AI代码解释
复制
}

你会失去堆栈跟踪信息...

要么做,

代码语言:txt
AI代码解释
复制
try { ... }
代码语言:txt
AI代码解释
复制
catch { throw; }

要么

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
try { ... }
代码语言:txt
AI代码解释
复制
catch (Exception ex)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
    throw new Exception("My Custom Error Message", ex);
代码语言:txt
AI代码解释
复制
}

你可能想要重新抛出的原因之一是,如果你正在处理不同的例外,例如

代码语言:txt
AI代码解释
复制
try
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
   ...
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch(SQLException sex)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
   //Do Custom Logging 
代码语言:txt
AI代码解释
复制
   //Don't throw exception - swallow it here
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch(OtherException oex)
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
   //Do something else
代码语言:txt
AI代码解释
复制
   throw new WrappedException("Other Exception occured");
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
   System.Diagnostics.Debug.WriteLine("Eeep! an error, not to worry, will be handled higher up the call stack");
代码语言:txt
AI代码解释
复制
   throw; //Chuck everything else back up the stack
代码语言:txt
AI代码解释
复制
}

御姐万岁

发布于 2017-12-13 04:24:28

第一; 在文章中的代码的方式是邪恶的。 throw ex会将异常中的调用堆栈重置为这个throw语句所在的位置; 失去了关于实际创建异常的信息。

其次,如果你只是像这样捕获并重新抛出,我没有看到任何附加价值,上面的代码示例将是一样的好(或者,如果没有尝试捕获,甚至更好)。

但是,有些情况下您可能想要捕捉并重新抛出异常。 记录可能是其中之一:

代码语言:txt
AI代码解释
复制
try 
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
    // code that may throw exceptions    
代码语言:txt
AI代码解释
复制
}
代码语言:txt
AI代码解释
复制
catch(Exception ex) 
代码语言:txt
AI代码解释
复制
{
代码语言:txt
AI代码解释
复制
    // add error logging here
代码语言:txt
AI代码解释
复制
    throw;
代码语言:txt
AI代码解释
复制
}
和开发者交流更多问题细节吧,去 写回答
相关文章
C# 异常捕获
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:C# 异常捕获 ---- C# 异常捕获 1.编译错误与运行错误 2.进行异常捕获 ---- 1.编译错误与运行错误 在编写程序时,编译器会帮我们检查程序是否有错误,当我们改正之后,程序就可以编译了,通常也能够正常运行。 让我们来看看下面这段代码: using System; namespace C
小嗷犬
2022/11/15
1.4K0
dotnet C# 在 finally 抛异常会发生什么
如果我在一个方法的 finally 里面抛出异常,而在 try 里面也抛出,那在上层拿到的是什么
林德熙
2021/12/24
3430
C# WinForm捕获全局异常
static class Program      {          /// <summary>          /// 应用程序的主入口点。          /// </summary>          [STAThread]          static void Main()          {              try              {                  //设置应用程序处理异常方式:ThreadException处理             
跟着阿笨一起玩NET
2018/09/18
2.4K0
C# WinForm捕获全局异常
C# WinForm捕获全局异常
网上找的C# WinForm全局异常捕获方法,代码如下: static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { try { //设置应用程序处理异常方式:ThreadExceptio
跟着阿笨一起玩NET
2020/07/27
1.3K0
Flask中异常捕获
HTTP 异常主动抛出 abort 方法 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。 参数: code – HTTP的错误状态码 # abort(404) abort(500)   抛出状态码的话,只能抛出 HTTP 协议的错误状态码  捕获错误 errorhandler 装饰器 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法 参数: code_or_ex
汪凡
2019/03/01
1.9K0
python中的异常捕获
无论是编程新手还是老手,都会遇到过程序报错,终止执行的情况,对于python的报错信息,可以分为以下两大类
生信修炼手册
2020/05/28
2.1K0
python抛出异常和捕获异常_在try块中可以抛出异常吗
2.解析 关键字try 以及except是 使用Python 解释器主动抛出异常的关键, Python解释器从上向下执行 当运行try中的某行代码出错,会直接进入except中执行下方代码 try中错行下方的代码不会被运行 except…as… 是固定的语法格式 打印traceback信息 finally 后的代码不管是否抛出异常都会执行 except 的原理 调用sys中 exc.info 方法返回基本信息 所以抛出异常的第一步拓展可以在这里开始 注意 每个关键字下方的代码都是独立的(所有的变量都是局部变量)
全栈程序员站长
2022/11/02
5.3K0
异常要怎么抛?
上一章,我们一起学习了打日志的点点滴滴,很多同学跟我反馈,自己好像从来没打对过日志,也有同学跟我吐槽,MD,最讨厌那些吞异常的SX。
彤哥
2021/02/02
1.5K0
Unity手游崩溃异常如何捕获--C#及JVM捕获
C#脚本未捕获的异常,与Android和Native未捕获异常很大的区别是,未捕获异常不会照成引用的闪退。所以,C#脚本的异常危害相对较小,但是同样更加容易存在在游戏中。闪退问题能够及时发现并进行修复。C#脚本异常,抛出的时机不同,危害性也有所不同; 在Start、Awake等函数抛出的异常,会造成Update、OnGUI无法正常运行,游戏可能表现为无响应、图片确实等。Update、OnGUI的异常也一定会引起游戏逻辑及画面上的一些异常。
WeTest质量开放平台团队
2018/10/29
4.5K0
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
使用 try-except 语句 , 不指定异常类型 , 默认就可以捕获所有类型的异常 ;
韩曙亮
2023/10/11
2.7K0
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
[javaSE] 异常捕获
异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} public class VariableDemo { /** * @param args */ public static void main(String[] args) { try { System.out.println(1
唯一Chat
2019/09/10
1.7K0
在Laravel中使用数据库事务以及捕获事务失败后的异常
在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:
全栈程序员站长
2022/07/08
1.5K0
在Laravel中使用数据库事务以及捕获事务失败后的异常
python – 异常捕获
直接上示例: 大概的意思就是当try下方的代码出现异常的时候就自动执行except下方的代码
Blank.
2023/04/12
1.5K0
【Flask】Flask框架使用中异常捕获
抛出一个给定状态代码的 HTTPException,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
天道Vax的时间宝藏
2021/08/11
1K0
python - 异常捕获
在执行python程序时,有时候会报异常,出错的原因可能是自己错写或少写,还有可能是执行程序时由于疏忽或者考虑不全造成了错误,Traceback可以追踪错误点,进行分析改正;这时我们可以对异常进行捕获处理,防止程序终止。
HammerZe
2022/03/25
2K0
python - 异常捕获
python异常捕获
下面写一个程序,这个程序接受用户的输入一个的正整数,然后与预设的一个正整数数比较,给出比较结果。 其中用户输入和预设的正整数范围是[0,10). answer = 5guess = int (input ('请输入一个[0,10)范围的正整数:'))if (guess == answer): print ('恭喜!猜对了!')else: print ('很遗憾!猜错了!') int()将输入的字符串格式的数字更改为数字格式的数字。 下面两个执行示例,其中第一次猜对了,第二次猜错了: $ py
mwangblog
2018/07/04
1.7K0
Python异常捕获和抛出-对方不想和你说话并向你抛出了一个异常
Python使用异常类来管理异常信息。当发生异常的时候,程序会抛出一个异常信息,自动根据代码的层次查找异常处理信息。当代码发生异常而没有指定处理异常的方法是,Traceback会打印发生异常时代码执行栈的情况。
唔仄lo咚锵
2021/09/14
1.3K0
Python异常捕获和抛出-对方不想和你说话并向你抛出了一个异常
list强转数组抛异常-ClassCastException
toArray(new String[0]), 创建一个大小为0的数组,当为输入数组长度小于集合size时,toArray方法会自动创建一个等大数组放入数据并返回。 toArray(new String[100000]),同上输入的10w数组比集合size小,toArray方法会重新创建一个等大数组放入数据并返回,原来的10w数组等于白建了 toArray(new String[1000000]),输入数组长度与集合size相等,当是一个理想状态时,即数组size没有发生变化(比如没有并发情况),那么toArray方法会直接使用输入数组并返回,但如果在输入数组创建之后,原集合size发生了变化,最糟糕的情况会退化为#2 toArray(new String[2000000]),输入数组长度大于集合size,那么toArray方法会直接使用输入数组并返回,当然多出去的那部分数组量就算浪费了
用户1503405
2021/10/06
5340
Java中的异常Exception和捕获,自定义异常
 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的。
鱼找水需要时间
2023/04/23
2.6K0
Java中的异常Exception和捕获,自定义异常
springboot中全局异常捕获类的写法
全局异常捕获:      当你访问页面出错时,默认是400或500以   及以一大串英文,自己写了全局异常捕获 类就可以在显示自己写的内容。   写法如下:  图片发自简书App 这样在页面
贪挽懒月
2018/05/18
1.9K0

相似问题

ios sdk demo一播放就抛异常?

2357

上传后想删除 却删除不了?

1211

为什么网站电脑能访问,手机却访问不了?

44.3K

为什么我配置完成了wordpress 站点却显示nginx?

21.2K

请问为什么我在IIS丄配置好了网站,访问域名却显示404?

32.7K
相关问答用户
某公司 | 程序员擅长1个领域
新浪微博 | 高级总监擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档