Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套的Try/Catch

嵌套的Try/Catch
EN

Stack Overflow用户
提问于 2010-02-22 19:54:35
回答 5查看 8.3K关注 0票数 18

使用嵌套的Try/Catch是不是编码不干净的信号?我想知道是不是因为在catch中我调用了另一个方法,如果调用失败,我会得到另一个运行时错误,所以我很想再次使用try/catch将这些调用包装在catch中。我想知道这样做是否正常?

例如:

代码语言:javascript
运行
AI代码解释
复制
    catch (Exception ex)
    {
        transaction.VoidOrder(transactionID);

        LogError(ex.ToString());
        Response.Redirect("Checkout", false);
    }

因此,VoidOrder甚至LogError方法可能会崩溃。现在,当我调用VoidOrder时,我在transactionID上得到了一个空引用,因为它调用了BL方法,在BL方法中,我重新抛出了它,这样我就可以在上面代码的更高级别捕获它。但是如果我在接球内再次投球,那么我也需要接球。

EN

回答 5

Stack Overflow用户

发布于 2010-02-22 20:00:31

下面是我们解决这个问题的方法:

从UI/ catch后台级别到其他层的所有调用都使用try-catch,其中我们总是捕获自定义异常。底层采取的所有操作都有自己的try-catch,用于记录、包装和抛出自定义异常。然后,UI可以依赖于此,并查找具有友好错误消息的已处理异常。

代码背后:

代码语言:javascript
运行
AI代码解释
复制
protected void btnSubmit_Click(object sender, EventArgs e)
{
    //do something when a button is clicked...
    try
    {
        MyBL.TakeAction()
    }
    catch(MyApplicationCustomException ex)
    {
        //display something to the user, etc.
        ltlErrorPane.Text = ex.Message;

        //or redirect if desired
        if(ex.ErrorType == MyCustomErrorsType.Transactional)
        {
            Response.Redirect("~/Errors/Transaction.aspx");
        }
    }
}

BL:

在业务层中,任何可能失败的操作都会使用try-catch,它会在将问题抛到UI之前记录并包装问题。

代码语言:javascript
运行
AI代码解释
复制
public class MyBL
{
    public static void TakeAction()
    {
        try
        {
            //do something
        }
        catch(SpecificDotNetException ex)
        {
            //log, wrap and throw
            MyExceptionManagement.LogException(ex)
            throw new MyApplicationCustomException(ex, "Some friendly error message", MyCustomErrorsType.Transactional);
        }
        finally
        {
            //clean up...
        }
    }
}

异常处理程序:

实际的异常处理程序有多种方式来记录日志,包括事件日志、文件日志,如果所有其他方法都失败了,最后还会发送电子邮件。如果记录器不能执行任何预期的操作,我们选择简单地返回false。不过,这是我个人的选择。我们认为3种方法连续失败的可能性很小(事件日志失败,尝试文件日志失败,尝试电子邮件失败,失败)。在这种情况下,我们选择允许应用程序继续运行。你的另一个选择是让应用程序完全失败。

代码语言:javascript
运行
AI代码解释
复制
public static class MyExceptionManagement
{
    public static bool LogException(Exception ex)
    {
        try
        {
            //try logging to a log source by priority, 
            //if it fails with all sources, return false as a last resort
            //we choose not to let logging issues interfere with user experience

            //if logging worked
            return true;
        }
        catch(Exception ex)
        {
            //in most cases, using try-catch as a true-false is bad practice
            //but when logging an exception causes an exception itself, we do
            //use this as a well-considered choice.
            return false;
        }
    }
}

最后,为了安全起见,我们实现了Application_Error全局事件处理程序(在Global.asax中)。对于我们没有正确尝试捕获的情况,这是最后的手段。我们通常记录并重定向到一个友好的错误页面。但是,如果上述自定义错误处理成功完成,则很少有错误会到达全局处理程序。

希望这能帮上点忙。这是一种可能的解决方案。几年来,它在一些较大的应用程序上运行得很好。

票数 15
EN

Stack Overflow用户

发布于 2010-02-22 20:20:46

在需要以其他重要方式记录、发送消息或对异常做出反应的顶级应用程序中,嵌套的try/catch块是不可避免的。

有一些方法可以减少嵌套块的数量(例如,使用ASP.Net的HttpApplication.Error处理程序合并错误处理(也称为.Application_Error)),但是您应该捕获处理代码产生的任何异常,并实现一个备份计划,以防所有其他方法都失败。

票数 5
EN

Stack Overflow用户

发布于 2010-02-22 20:24:13

嵌套问题的另一个解决方案是将内部函数(LogError等)的try/catch逻辑封装在这些函数中,而不是依赖调用者来捕获它们。对于LogError来说,这是有意义的,因为无论是谁在尝试记录错误,您都可能希望以相同的方式处理损坏的错误记录器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2313696

复制
相关文章
try()catch{}写法
当生活像一首歌那样轻快流畅时,笑颜常开乃易事;而在一切事都不妙时仍能微笑的人,是真正的乐观。——威尔科克斯 曾经我们使用java的IO流复制文件时是这么写的 package com.ruben; import java.io.*; import java.util.Optional; /** * @ClassName: FileDemo * @Description: 我还没有写描述 * @Date: 2021/1/10 0010 21:38 * * * @author: <achao1
阿超
2022/08/16
1.3K0
try catch的作用
public static void main(String[] args) { int i; i = 2/0; System.out.println(i); System.out.println(1111111111);
全栈程序员站长
2022/09/07
1.5K0
多层try catch嵌套_方法嵌套一般不超过多少层
<asp:Repeater ID=”rp” runat=”server”> <ItemTemplate> <%# Eval(“id”) %> <asp:Repeater ID=”rp1″ runat=”server” DataSource='<%# GetData(Eval(“id”)) %>’> <ItemTemplate> <%# Eval(“name”) %><br /> </ItemTemplate> </asp:Repeater> <br /> </ItemTemplate> </asp:Repeater>
全栈程序员站长
2022/11/07
7530
try和catch的使用。
// 报错,a找不到,程序终止,不往下继续。 console.log(a) // 放在try里 try { // a不打印 console.log(a) }catch(e){ // e是错误信息 console.log(e) // 弹出123 alert("123") } // 如果放在try中 弹出2 // 否则终止 alert("2") // 使用 let 不变量提升 let a = 0 总结:在使用try和catch时,程序报错但依然可以向下进行(node中系统错误,因为不可预知,需要大量代码来cat
biaoblog.cn 个人博客
2022/08/11
1.8K0
Try catch如何使用[通俗易懂]
浏览器的兼容性是程序员很头痛的事儿,往往一些出错会让我们查找许久,在使用try catch能更好的解决兼容性出错的问题:由于不同浏览器报错提示也不尽相同,通过使用try catch捕获的浏览器的报错提示,来判断用户使用的浏览器,然后做出对应的解决方法;那么,你如果用if,就只能反馈真或假,而不能直接抛出浏览器的报错内容。
全栈程序员站长
2022/08/31
1.9K0
try-catch-finally
总结: 1、finally语句中没有return时,执行完try或catch语句的return之后还会执行finally。(而return的值会暂存在栈里面,等待finally执行后再返回) 2、finally语句中有return时,依然会执行try或catch语句的return,但是最终返回的是finally语句中的return。
用户9854323
2022/06/25
8280
try-catch的性能分析
https://blog.csdn.net/lylwo317/article/details/51869893
葆宁
2019/04/18
1.8K0
try-catch的性能分析
SAP ABAP TRY CATCH
SAP 开发中会遇到两种系统异常,一种是基于异常类的异常,可以通过系统变量SY-SUBRC来进行判断;另外一种是非类异常,系统的异常,例如0作为除数的情况。
matinal
2023/10/13
2960
简单理解try catch和try finally
错误可能是语法错误,通常是程序员造成的编码错误或错别字。也可能是拼写错误或语言中缺少的功能。
PHP学习网
2022/08/03
1.2K0
try catch finally 用法[通俗易懂]
请问答案是:“return value of getValue():0 还是 return value of getValue():1”呢?
全栈程序员站长
2022/09/07
1.5K0
C# try catch finally
 catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。
aehyok
2018/09/11
1.8K0
try catch 对性能影响
之前一直没有去研究try catch的内部机制,只是一直停留在了感觉上,正好这周五开会交流学习的时候,有人提出了相关的问题。借着周末,正好研究一番。
全栈程序员站长
2022/07/04
1.6K0
try catch 对性能影响
[PHP] try catch在日常中的使用
2.finally是不管try或者catch任何一块有return, 最终都会执行的块
唯一Chat
2019/09/10
1.7K0
解决多个io流需要关闭而重复嵌套try-catch-finally的问题
相信大多数人都见过如此状态,流多了需要层层关闭,需要层层加上try-catch,为保证下一个流能关闭又要加上finally,烦人!!
砖业洋__
2023/05/06
5360
解决多个io流需要关闭而重复嵌套try-catch-finally的问题
try catch finally 实现机制
try catch finally如何执行异常时跳转?finally 语句为何一定会执行?
Erossssssss
2021/04/09
2.6K0
try catch finally 实现机制
替代try catch处理异常的优雅方式
小熊学Java个人网站:https://javaxiaobear.gitee.io/
小熊学Java
2023/07/16
4690
替代try catch处理异常的优雅方式
捕获异常try…catch…finally
try:该代码块中编写可能产生异常的代码。 catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。 finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
秋白
2019/02/21
1.3K0
捕获异常try…catch…finally
建议大型项目用上Try Catch建议大型项目用上Try Catch
我们在平时项目做功能的时候,经常会遇到崩溃的情况。如果是我们在开发测试阶段,我们可以找到原因修复。但是遇到已经上线,出现这种问题。要么使用JSPatch进行热修复,但是使用热修复修复苦只有写的人知道。
君赏
2018/08/31
8970
try catch 中的异常怎么处理?
在我们日常开发中, 经常会遇到一些异常需要去手动处理, 或者说是一些可能出现的异常去处理, 又或者说你不知道的异常, 等着暴露出来发现后去处理, 无论哪种异常, 当它出现的时候都是头疼的.
星尘的一个朋友
2020/11/25
1.2K0
给react加try-catch
最近在一个使用fis构建的react.js项目里遇到个问题,render函数里如果发生了运行时错误,比如说某个对象没有判断就直接去访问其属性,那我所知道的就是,页面不正常了,特别是有嵌套子组件的时候,
IMWeb前端团队
2017/12/29
3.2K0

相似问题

嵌套的try catch

20

嵌套Try/Catch块

10

避免嵌套的try/catch

31

将异常传递给嵌套Try/Catch中的更高Try/Catch [需要嵌套]

113

异步/等待嵌套try/catch

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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