首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次试块

多次试块
EN

Stack Overflow用户
提问于 2022-04-15 21:10:56
回答 1查看 204关注 0票数 0

我想解决的问题是这样的:我试图从一个网页中抓取一些内容,我使用selenium,findElementByClassName来获取元素内容,直到现在它都很好用。但是,考虑到我正在抓取的网站更改了html中的一个元素类,我不想得到一个could not find element exception,使得其余的代码不执行,直接跳入catch块。

我的想法是将每一行代码放入一个try catch块中,但是有大约15个字段我想要刮掉,这使得代码看起来很难看。你自己看看:

代码语言:javascript
复制
      String name = null;
      String type = null;
      String description = null;
      
      try {
         driver.get(link);
         
         try {
             name = driver.findElementByClassName(environment.getProperty("booking.propertyName")).getText();
         }catch (Exception e){
            log.error("error doing thing");
         }

         try {
            type = driver.findElementByClassName(environment.getProperty("booking.propertyType")).getText();
         }catch (Exception e){
            log.error("error doing thing");
         }

         try {
            description = driver.findElementByClassName(environment.getProperty("booking.propertyDescription")).getText();
         }catch (Exception e){
            log.error("error doing thing");
         }
         
      }catch (Exception e){
        log.error("Error during scraping");
      }

因此,如果其中一件事情出了问题,我仍然希望代码的其余部分继续运行,而不是在第一个失败会阻止其他事情执行的试图捕获块中。上面的代码工作得很好,但它看起来不太好,所以我的问题你知道我怎样才能让这个看起来更好看吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-15 21:37:19

这里没有魔法子弹。但是避免重复代码的标准方法是重构。例如:

代码语言:javascript
复制
 try {
    type = driver.findElementByClassName(environment.getProperty("something"))
                 .getText();
 } catch (Exception e){
    log.error("error doing thing");
 }

可重写为:

代码语言:javascript
复制
 type = getElementTextIgnoringExceptions(driver, environment, "something");

其中,getElementTextIgnoringExceptions被定义为如下所示:

代码语言:javascript
复制
 public String getElementTextIgnoringExceptions(
         Driver driver, Environment env, String name) {
     try {
         String className = env.getProperty(name);
         return driver.findElementByClassName(className).getText();
     } catch (Exception ex) {
         log.error("error getting " + name, ex);
         return null;
     }
 }

但是..。在这里,您试图简化的代码有一些不好的地方:

  1. 捕捉Exception是不好的。您不知道将捕获什么,也不知道是否安全或明智地继续下去。
  2. 不记录异常是不好的。如果在异常(在应用程序的上下文中)可能导致问题后,日志file?
  3. Continuing中只有“错误处理”消息,那么您将如何诊断问题。您的代码的其余部分将散落在null检查中,以处理无法获取的元素(或任何其他元素)。如果错过一次检查,您就很容易得到NPE;例如,在单元测试中没有涵盖的边缘情况下。

这些问题比代码看起来更有意义。

如果您使用的是Java,则可以重构,以便将逻辑作为lambda表达式传递。这取决于使用的变量的性质。

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

https://stackoverflow.com/questions/71888989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档