当前位置:主页 > DDOS和CC >

cdn高防_联通云盾_精准

时间:2021-06-11 20:21来源:E度网络 作者:E度网络 点击:

cdn高防_联通云盾_精准

异常之类的错误处理机制会导致程序的常规控制流出现偏差。这些偏差使得对程序进行推理变得更加困难,并且常常是程序中错误的来源。Java通过Try-Catch-Finally语句提供异常处理。A~weimer/p/weimer-toplas2008.pdf 2008年Wiemer和Necula对开源Java程序的研究发现,异常处理贡献了高达5%的源代码,高达45%的程序文本可以通过catch和finally块进行传递访问。他们还发现,有时为了正确处理异常,您需要嵌套Try-Catch-Finally块,但是开发人员避免这样做,因为这会影响代码的可读性。在本文中,我们将研究Java中嵌套Try-Catch-Finally语句的各种示例,以及如何以及何时避免它们。嵌套的Try Finally示例让我们从以下Wiemer和Necula论文中的示例开始:连接cn;准备报表ps;结果集rs;cn=ConnectionFactory.getConnection(/* ... */);试试看{StringBuffer qry=…;//做些工作ps=cn.准备陈述(qry.to字符串());试试看{卢比=ps.executeQuery();试试看{... //与rs/O相关的工作}最后{关闭卢比();}}最后{ps.关闭();}}最后{cn.关闭();}在本例中,当同时使用多个资源(cn、ps和rs)时,有必要将Try Finally块嵌套3层,以便使用close()方法正确释放它们。结果代码的可读性不是很好,甚至可能会让一些开发人员感到困惑。另一种方法是执行以下操作:连接cn=null;PreparedStatement ps=null;结果集rs=null;试试看{cn=ConnectionFactory.getConnection(/* ... */);StringBuffer qry=…;//做些工作ps=cn.准备陈述(qry.to字符串());卢比=ps.executeQuery();... //使用rs进行I/O相关工作吗}最后{如果(rs!=null)尝试{关闭卢比()}捕获(异常e){}如果(ps!=null)尝试{ps.关闭()}捕获(异常e){}如果(cn!=null)尝试{cn.关闭()}捕获(异常e){}}此解决方案使用null作为sentinel值。虽然它是正确的,但它更容易出错。e、 g.很容易忘记对特定资源的检查。一般来说,正确处理这样的N个资源需要N个嵌套的Try Finally块或多次运行时检查。嵌套Try-Catch示例与Try Finally块的情况类似,我们有时可能需要嵌套Try-Catch块。作为示例,请查看下面的代码(来自此链接):试试看{事务.提交();}抓住{logerror();试试看{事务.回滚();}抓住{logerror();}}提交事务时,如果失败,ddos防御怎么设置,我们会记录错误,然后尝试通过回滚进行恢复。但是,此回滚本身可能会失败,这需要另一个嵌套的Try-Catch块才能正确处理。事实上,当从异常本身恢复错误可能引发另一个异常时,会发生导致嵌套Try-Catch的常见用例。最近,我在尝试使用JRuby解析器库解析一些Ruby代码时遇到了类似的问题。库提供的解析器有三个兼容版本,用于解析不同版本的Ruby(2.0、1.9和1.8)。因此,哪些方法可以防御ddos攻击,要解析任意的Ruby代码,我们需要在第一个失败的情况下逐个尝试。如果解析代码失败,解析器抛出可能会出现异常,因此我最终编写了两个嵌套Try-Catch块的代码,如下所示:试试看{节点根=rubyParser.parse(f,newStringReader(文件内容),newParserConfiguration(0,兼容版本.RUBY2\u 0));根。接受(newRubyVisitor(calls));}捕获(异常e){试试看{节点根=rubyParser.parse(f,newStringReader(文件内容),newParserConfiguration(0,穿盾cc怎么防御,兼容版本.RUBY1\u 9));根。接受(newRubyVisitor(calls));}catch(异常ex){节点根=rubyParser.parse(f,云锁防御ddos,newStringReader(文件内容),newParserConfiguration(0,兼容版本.RUBY1\u 8));根。接受(newRubyVisitor(calls));}}如何避免筑巢?上面嵌套的Try-Catch块实际上是完全可以避免的。安全重写它以使其不使用嵌套Try-Catch的一种方法如下:for(兼容版本cv:cvarr){试试看{根=rubyParser.parse(f,新的FileReader(f),新的ParserConfiguration(0,cv));休息;}接球(抛掷e){Logger.getLogger(SourceAnalysis.class.getName()).日志(级别警告,"文件分析错误"+f+"和解析器版本"+cv,e);}}我重构了代码,ddos的原理和防御,将Try-Catch移到一个循环中,该循环将尝试解析器的不同兼容版本。所以避免嵌套的一种方法是改变块周围的控制流。另一个避免嵌套Try-Catch Finally块的好方法(在这里描述)是看看我们是否可以将它们组合起来。如果嵌套仅用于捕捉不同类型的异常,并且可以按如下方式组合,则此方法更有用:试试看{//代码}catch(第一种例外情况){//做点什么}catch(第二类异常){//做点别的}但是,在某些情况下,可能无法避免嵌套(例如,当错误恢复本身可以引发异常时)。即使这样,我们也可以通过使用early exists并将嵌套部分移动到新方法中来提高代码的可读性。因此,对于前面的事务错误恢复示例,我们可以按照以下方式编写而不嵌套:试试看{事务.提交();}抓住{callerrorrecovery();}私人无效呼叫恢复(){试试看{事务.回滚();}抓住{logerror();}}将嵌套部分作为一种新方法提取将始终适用于任意嵌套的Try-Catch-Finally块。所以这是一个可以用来改进代码的技巧。您是否认为嵌套Try-Catch Finally块是一种不好的做法?或者,如果你知道其他的方法来避免它们,请在评论中告诉我们。

推荐文章
最近更新