無効なQueryLocator例外をキャッチ

Salesforce QueryLocators have a
number of restrictions
, including that a user can only have 50
active at a time, and that they time out after about 15 minutes of
inactivity.

私はこれらの制限にぶつかるいくつかのコードをデバッグしようとしていますが、例外をキャッチする方法を理解することはできません。ここにサンプルがあります:

public PageReference refreshWhichFails() {
    System.debug('Method starting.');
    try {
        callThatFailsWithInvalidQueryLocator();
    } catch (Exception e) {
        System.debug('Oops, something went wrong!');
    }
    System.debug('Method ending.');
}

これをテストするために、私のページをロードした後、私は実行して匿名を実行し、50のQueryLocatorsをインスタンス化します。これにより、VFページのQueryLocationが無効になります。次に、私はこのメソッドを実行し、致命的なエラーを取得します。

このページでは、無効なQueryLocatorを使用しています。ユーザーごとに50のQueryLocatorsがあります。

デバッグログを調べると、最初のデバッグ文だけが存在し、
callThatFailsWithInvalidQueryLocator 中に実行が失敗します。

無効なQueryLocatorエラーを検出するにはどうすればよいですか?

ベストアンサー

上のコードとその結果を考えれば、これは “捕まえられない例外”のように思えます(このページを参照してください)。残念ながら、私はそのような例外の明確なリストを知らない。

それはエレガントではありませんが、DatetimeでQLの年齢を追跡し、10分以上経過するといつでも再初期化できますか?

Update 22 Jan 2016: So I ran into this error
today; imagine my surprise when I searched SFSE and found that I’d
been the one to answer the question! I had built a page using a
private StandardSetController + cached wrapper objects to manage
pagination, and twice during the day I stopped for a meeting,
receiving the error upon returning to the page and trying to
navigate. Certainly looked like a timeout.

standardSetControllerメソッドを呼び出すコントローラメソッドを既に追加していたので、たとえば:

public void nextPage() {
    setCon.nextPage();
}

タイムアウトを管理するプライベートメンバーとメソッドを追加しました。

// initialized to DateTime.now() when setCon is initiallized
private setControllerBirthday {get; set;} 

// Make SetController safe 
private void BubblewrapSetController() {
    if (setControllerBirthday < Datetime.now().addMinutes(-10)) {
        integer pageNum = setCon.getPageNumber();  //maintain current page
        id filterId = setCon.getFilterId();        //maintain current filter
        setCon = new ApexPages.StandardSetController(Database.getQueryLocator([...]));
        setCon.setFilter(filterId);                //restore filter
        setCon.setPageNumber(pageNum);             //restore page
        setControllerBirthday = DateTime.now();    //restart the clock
    }
}

最後に、新しいメソッドを呼び出すようにナビゲーションメソッドを更新しました。たとえば、

public void nextPage() {
    BubblewrapSetController();
    setCon.nextPage();
}

これは、たとえ20分間も使用しなくても、期待どおりに動作します。ラッパーオブジェクトのキャッシュと組み合わせることで、タイムアウトのリスクを伴わずにシームレスな編集を行うことができます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です