2013-11-01 111 views
2

我有一個有12個步驟的登錄過程的API。登錄成功大部分時間,但它會一次又一次地拋出一個錯誤(通常與JSON解析失敗有關),這是嘗試的結束。CFTry直到登錄成功

我從來沒有用過CFTry但是從已經讀了它,看着例子我仍然無法找到這個問題的答案...

是否有可能把這個整個登錄腳本中在嘗試執行腳本的條件CFTry塊,直到帳戶已成功登錄?

+0

在任何人甚至可以開始嘗試並回答這個問題之前,您需要提供一些代碼。 –

回答

5

<cftry>並不像你認爲的那樣工作。但在與<cfloop>結合使用並適當使用漁獲物時,仍然可以用於這種情況。

我有一個類似的問題,我有3個驗證服務器需要檢查。如果第一次失敗,則檢查第二次,如果第二次失敗,則檢查第三次。我用循環完成了這個。

現在,我絕對不建議你「嘗試一下,直到成功」,除非你津津樂道於發生意外事件時讓你的服務器跪下。但是你可以做一些像這樣的僞CFML。

<cfloop from="1" to="3" index="authIndex"> 
    <cftry> 
     <!--- Check JSON parsing result ---> 
     <cfif NOT isJSON(jsonData)> 
      <cfthrow type="badJSON" message="JSON Parsing failure" /> 
     <cfelse> 
      <cfset userData = deserializeJSON(jsonData) /> 
     </cfif> 

     <cfif authUser(userData.userInfo, userData.userpassword)> 
      <cfset session.user = {} /> 
      <cfset session.user.auth = true /> 
      <!--- whatever other auth success stuff you do ---> 
     <cfelse> 
      <cfthrow type="badPassOrUsername" message="Username of password incorrect" /> 
     </cfif> 

     <!--- If it makes it this far, login was successful. Exit the loop ---> 
     <cfbreak /> 

     <cfcatch type="badPassOrUsername"> 
      <!--- The server worked but the username or password were bad ---> 
      <cfset error = "Invalid username or password" /> 

      <!--- Exit the loop so it doesn't try again ---> 
      <cfbreak /> 
     </cfcatch> 

     <cfcatch type="badJSON"> 
      <cfif authIndex LT 3> 
       <cfcontinue /> 
      <cfelse> 
       <!--- Do failure stuff here ---> 
       <cfset errorMessage = "Login Failed" /> 
       <cflog text="That JSON thing happened again" /> 
      </cfif> 
     </cfcatch> 
    </cftry> 
</cfloop> 

將上面的代碼: - 只有當用戶名或密碼是壞 一次嘗試 - 將嘗試三倍如果發生JSON解析數據。 - 只會嘗試儘可能多的次數。一旦獲得適當的JSON響應,它應該授權或不授權並繼續。

+0

Jason我認爲這已經讓事情變得更清楚了,因爲我將圍繞CFHTTP調用循環,該調用返回X次的JSON響應,並且如果最壞的情況每次都有一個JSON錯誤,那麼我將設置一個reload變量爲true (我對其他答案做了什麼),否則我會繼續使用較少的腳本。謝謝你的幫助。 – CPB07

2

你的計劃不大可能奏效,但它可能。 cftry/cfcatch像這樣工作

<cftry> 
code 
<cfcatch> 
code that runs if there is an error. 
</cfcatch> 
</cftry> 

如果您想再次嘗試,可以將該代碼塊放入循環中。

<cfset success = "false"> 
<cfloop condition= "success is 'false'"> 
<cftry> 
code 
<cfset success = "true"> 

<cfcatch> 
code that runs if there is an error. 
it has to change something since this is in a loop 
</cfcatch> 
</cftry> 

然而,如果你的錯誤是JSON解析,你有什麼打算到cfcatch塊內改變,使你最終會成功嗎?

+2

爲什麼不使用布爾值作爲'false'而不是將它作爲字符串輸出? '' –

+0

JSON解析錯誤很奇怪,同一個請求在大部分時間都有效,但是一次又一次地返回這個錯誤,但是我重新提交它的頁面然後通常再次成功,所以我認爲只是嘗試腳本,直到它達到一個Session.loggedIn變量設置的點可能會做的工作 – CPB07

+1

因爲你問,我認爲條件=「成功是'假''是比條件更可讀=不成功。然而,正如你所指出的那樣,我不需要把變量變成一個字符串。我只是習慣於引用任何不是數字的東西。 –

1

那麼你可以這樣做 - 把你的登錄調用放入一個函數,並用try catch塊包圍它,並在catch塊內調用main函數直到你成功。它或多或少像一個遞歸函數,它有自己的陷阱,如進入永無止境的循環並關閉服務器。但是你可以通過在應用程序/會話範圍中設置一個計數器或類似的東西來緩和這個問題

<cffunction name="main"> 

    <cftry> 
     <cfset success = login()> 
    <cfcatch> 
     <cfset main()> 
    </cfcatch> 
    </cftry> 

    </cffunction> 

    <cffunction name="login"> 
    <!--- Do login stuff here ---> 
    </cffunction> 
+0

是的,我已經得到了一個Session變量,它決定了整個登錄嘗試的次數,如果它達到4,那麼它會再次嘗試30分鐘,然後再次嘗試,以便處理無限循環。謝謝你的幫助 – CPB07