【问题标题】:Does an exception inside a TRY block break its execution?TRY 块内的异常是否会中断其执行?
【发布时间】:2010-12-24 09:27:03
【问题描述】:

我正在导入几个字段,也就是说,大约 25 行代码,每个导入一个字段(在我的情况下,真的没有其他方法)。 它在 try-catch 块中,但有时源中不存在此字段,但我必须得到其余部分。

从 20.
我得到 10
第 11 个不存在(例外) 我还需要从 12 到 20。

如果我不想一一测试存在,我想知道 try 是如何工作的。如果发生异常,它不会执行其余的,对吗?什么适合我?

obs:超过 20 个,我想要一个智能且无污染的解决方案。

【问题讨论】:

  • 显示一些代码。这将对我们有所帮助。
  • 什么语言 - .NET?爪哇?其他?
  • 关于使用哪种语言的任何信息?
  • vb.net 或 c#,任何一个.. 仅供我理解。
  • 这是一个关于如何处理可能的异常并可能忽略它们的问题,我真的不认为我需要在这里粘贴代码.. 它是关于 try-catch 块的行为。跨度>

标签: c# vb.net exception exception-handling try-catch


【解决方案1】:

这里是try-catch-finally

我仍然建议检查该字段的存在。这样更简洁,更正确。

【讨论】:

  • 我有 80 多个按类别组织的字段,可读性极强。通过一一检查存在,它会(字面上)将这部分代码增加三倍并使其变得非常不可读(我正在使用vb.net)
  • 您可以使用函数来检查和分配值。如果代码看起来如此重复,难道这不可能在循环中实现吗?
【解决方案2】:

循环中的异常会比仅仅检查有效性要慢很多

【讨论】:

    【解决方案3】:

    是的,异常确实会破坏 try 块 - 这是处理它们的方法。
    如果你想继续前进,你需要在每个领域都尝试/捕捉。这并不意味着要写 20 次,远非如此,重构你的代码:

    • 添加一个获取字段(作为字符串?)并尝试返回值的函数。
    • 创建一个新类并将每个字段定义为一个对象。
    • 不要抛出异常——如果这是常见的情况,不要抛出异常!在读取值之前添加检查。同样,将其移至函数会有所帮助。

    【讨论】:

    • +1 提示“这并不意味着要写 20 次,远非如此,重构你的代码”语句。
    • 是的,当你说“为每个领域做点什么”时,我想我没听懂。我是编程新手,您可能已经注意到了。抱歉 =)
    【解决方案4】:

    如果在 try 块中发生异常,则异常之后的任何内容都不会被执行。因此,如果项目 11 发生异常,项目 12 - 20 将不会被执行。执行将从第 11 项跳转到 catch 块,如果有 finally 块,再跳转到 finally 块。

    根据您的问题所说,当字段不存在时,您会遇到异常。我建议检查该字段是否存在,然后进行操作。我不建议使用 try catch 作为检查存在条件的方法。尝试捕获应该用于错误处理,如果您确实收到错误,您通常不想继续正常执行。如果您不喜欢检查每一行的条件,或者除了捕获异常之外没有其他方法可以检查它,那么我建议使用 try catch 来创建一个帮助函数

    boolean checkField(field){
      try{/* do operation on field*/}
      catch(Exception e){return false;}
      return true;
    }
    
    void main(){
       if !(checkField(field1)) return;
       else if !(checkField(field2)) return;
       .
       .
       .
    }
    

    【讨论】:

    • 我没想到,这样我会在每个领域做一个小的改变并编写一个函数..这是明智的,干净的..谢谢!还是会等着看会不会有更好的结果出来
    • 这就是 stackoverflow 的全部意义所在,而且通常会出现更好的东西,这就是我不断回来的原因!
    • 谢谢你!我用过你的,做了一个检查是否没有异常发生并返回值的函数。然后用三个简单的(仔细编写的)replace all's 更改每一行。五分钟后,我在 115 个字段中应用了它(我不确定它们有多少。全部替换功能告诉你它做了多少更改。真的谢谢!
    • 没问题,很高兴我能帮上忙。
    【解决方案5】:

    当try块内发生异常时,会直接跳到catch块(如果没有catch块,会跳到finally块,异常会冒泡。所以,代码在 try 块 AFTER 发生错误后不会被执行。

    要么:
    1) 每次尝试前检查字段是否存在
    2) 将每个单独的字段导入包装在它自己的 try...catch 中

    我会选择 1),首先防止异常发生。

    如果你重构/拆分代码来检查一个字段是否存在到一个单独的可重用方法中,实际上并没有那么大的努力。

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 2018-02-20
      • 2021-11-17
      • 2023-01-25
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2014-07-15
      相关资源
      最近更新 更多