12 段階のログイン処理を行う API があります。ほとんどの場合、ログインは成功しますが、ときどきエラー (通常は JSON 解析の失敗に関連する) がスローされ、それで試行が終了します。
私はCFTryを使用したことはありませんが、それを読んで例を見たところ、この質問に対する答えを見つけることができませんでした...
アカウントが正常にログインされるまでスクリプトを実行しようとする条件で、このログイン スクリプト全体を CFTry ブロックに入れることは可能ですか?
12 段階のログイン処理を行う API があります。ほとんどの場合、ログインは成功しますが、ときどきエラー (通常は JSON 解析の失敗に関連する) がスローされ、それで試行が終了します。
私はCFTryを使用したことはありませんが、それを読んで例を見たところ、この質問に対する答えを見つけることができませんでした...
アカウントが正常にログインされるまでスクリプトを実行しようとする条件で、このログイン スクリプト全体を CFTry ブロックに入れることは可能ですか?
<cftry> は、あなたが思っているようには機能しません。ただし、<cfloop> と組み合わせて catch を適切に使用すれば、この状況でも使用できます。
チェックする必要がある3つの認証サーバーがあるという同様の問題があります。1 番目が失敗した場合は 2 番目をチェックし、2 番目が失敗した場合は 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>
上記のコードは: - ユーザー名またはパスワードが間違っている場合は 1 回だけ試行します。 - JSON 解析データが発生した場合は、最大 3 回試行します。- 必要な回数だけ試行します。適切な JSON 応答が返されたら、認証するかしないかのいずれかで続行します。
あなたの計画がうまくいく可能性は低いですが、うまくいくかもしれません。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 ブロック内で何を変更しますか?
このように行うことができます-ログイン呼び出しを関数に入れ、それをtry catchブロックで囲み、catchブロック内で成功するまでメイン関数を呼び出します。これは多かれ少なかれ再帰関数に似ており、終わりのないループに入ってサーバーをダウンさせるなどの独自の落とし穴があります。ただし、アプリケーション/セッションスコープでカウンターなどを設定することで、それを緩和できます。
<cffunction name="main">
<cftry>
<cfset success = login()>
<cfcatch>
<cfset main()>
</cfcatch>
</cftry>
</cffunction>
<cffunction name="login">
<!--- Do login stuff here --->
</cffunction>