代码之家  ›  专栏  ›  技术社区  ›  thichxai

Marklogic抛出捕获异常后如何继续循环

  •  0
  • thichxai  · 技术社区  · 6 年前

    我想知道如何在抛出异常后继续循环,并且文档在总数时失败。

    xquery version "1.0-ml";
    try {
      let $uris := cts:uris((),(),
                     cts:and-query(
                       cts:collection-query("/TRA")
                     )
      )[1 to 200000]
    
      for $uri in $uris
      return    
        if (fn:exists(doc($uri))) then ()
        else $uri,
    
      xdmp:elapsed-time()
    } catch($err) { 
      "received the following exception: ", $err
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Mads Hansen    6 年前

    将try-catch语句放入循环中

    xquery version "1.0-ml";
    
    let $uris := cts:uris((),(),
                   cts:and-query(
                     cts:collection-query("/TRA")
                   )
    )[1 to 200000]
    
    for $uri in $uris
    return
      try{(
            if (fn:exists(doc($uri))) 
            then ()   
            else $uri,
            xdmp:elapsed-time()
          )
      } catch($err) { 
        "received the following exception: ", $err
      }
    
        2
  •  2
  •   wst    6 年前

    for ,在您希望引发异常的调用周围:

    let $uris := 
      cts:uris((),'limit=200000',
        cts:and-query(
         cts:collection-query("/TRA")
        ))
    for $uri in $uris
    let $result :=
      try { fn:exists(doc($uri)) }
      catch($err) { $err }
    return
      typeswitch($result)
      case element(error:error) return ("received the following exception: ", $result)
      default return $result
    , 
    xdmp:elapsed-time()
    

    使用try/catch有一些开销,因此您可能会注意到这个查询由于对序列中的每个项调用一次而变慢。