<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="zend.gdata.exception">
    <title>Gdata の例外処理</title>

    <para>
        <classname>Zend_Gdata_App_Exception</classname> は、
        <classname>Zend_Gdata</classname> がスローする例外の基底クラスです。
        <code>Zedn_Gdata</code> がスローする例外は、すべて <classname>Zend_Gdata_App_Exception</classname> でキャッチできます。
    </para>

    <programlisting language="php"><![CDATA[
try {
    $client =
        Zend_Gdata_ClientLogin::getHttpClient($username, $password);
} catch(Zend_Gdata_App_Exception $ex) {
    // 例外の内容をユーザに報告します
    die($ex->getMessage());
}
]]></programlisting>

    <para>
        <classname>Zend_Gdata</classname> では、以下のような例外サブクラスを使用しています。

        <itemizedlist>
            <listitem>
                <para>
                    <classname>Zend_Gdata_App_AuthException</classname>
                    は、ユーザのアカウントの情報が無効であることを表します。
                </para>
            </listitem>
            <listitem>
                <para>
                    <classname>Zend_Gdata_App_BadMethodCallException</classname>
                    は、そのサービスがサポートしていないメソッドをコールしたことを表します。
                    たとえば、CodeSearch サービスは <methodname>post()</methodname>
                    をサポートしていません。
                </para>
            </listitem>
            <listitem>
                <para>
                    <classname>Zend_Gdata_App_HttpException</classname>
                    は、<acronym>HTTP</acronym> リクエストが失敗したことを表します。
                    <classname>Zend_Http_Response</classname> オブジェクトの中身を調べることで、
                    実際の原因がわかります。この場合は
                    <command>$e->getMessage()</command> の情報だけでは不十分です。
                </para>
            </listitem>
            <listitem>
                <para>
                    <classname>Zend_Gdata_App_InvalidArgumentException</classname>
                    は、その状況では無効な値を指定したことを表します。
                    たとえば、カレンダーの可視性に "banana"
                    を指定したり、blog の名前を省略して Blogger のフィードを取得したりといった場合です。
                </para>
              </listitem>
              <listitem>
                <para>
                  <classname>Zend_Gdata_App_CaptchaRequiredException</classname>
                  は、ClientLogin を試みた際に認証サービスから
                  <trademark>CAPTCHA</trademark> チャレンジを受け取った場合にスローされます。
                  この例外の中には、トークン ID および
                  <trademark>CAPTCHA</trademark> チャレンジ画像への <acronym>URL</acronym>
                  が含まれています。この画像はパズルのようなもので、
                  これをユーザに対して表示させる必要があります。
                  チャレンジ画像に対するユーザからの応答を受け取ったら、
                  それを用いて再度 ClientLogin を試みることができます。
                  あるいは、ユーザが直接
                  <ulink url="https://www.google.com/accounts/DisplayUnlockCaptcha"/>
                  を使用することもできます。詳細な情報は
                  <link linkend="zend.gdata.clientlogin">ClientLogin のドキュメント</link>
                  を参照ください。
                </para>
              </listitem>
        </itemizedlist>
    </para>

    <para>
        これらの例外サブクラスを使用すると、より細やかな例外処理を行なえます。
        どの <classname>Zend_Gdata</classname> のメソッドがどんな例外サブクラスをスローするのかについては、
        <acronym>API</acronym> ドキュメントを参照ください。
    </para>

    <programlisting language="php"><![CDATA[
try {
    $client = Zend_Gdata_ClientLogin::getHttpClient($username,
                                                    $password,
                                                    $service);
} catch(Zend_Gdata_App_AuthException $authEx) {
    // ユーザの認証に失敗しました
    // もう一度認証を行うなどの処置が適切でしょう
    ...
} catch(Zend_Gdata_App_HttpException $httpEx) {
    // Google Data のサーバに接続できませんでした
    die($httpEx->getMessage);}
]]></programlisting>

</sect1>
