2

私のasp.net/c#プロジェクトでは、iTextsharp dllを使用して多くのpdfドキュメントからテキストを読み取っていますが、時々このエラーが発生します

System.Web.HttpException: 要求がタイムアウトしました。

しかし、それを行うコードは次のとおりです。

    public static bool does_pdf_have_keyword(string keyword, string pdf_src) 
    {
        try
        {
            PdfReader pdfReader = new PdfReader(pdf_src);
            string currentText;
            int count = pdfReader.NumberOfPages;
            for (int page = 1; page <= count; page++)
            {
                ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
                currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy);
                if (currentText.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) != -1) return true;
            }
            pdfReader.Close();
            return false;
        }
        catch
        {
            return false;
        }
    }

では、ページが try catch にあり、catch がすべてをキャッチするはずなのに、なぜハンドルされない例外が発生するのでしょうか?

4

2 に答える 2

5

この例外をキャッチしていない理由tryは、取得している例外がコード自体からスローされたのではなく、サーバーからスローされたためだと思います。

次のように考えてください。

  • あなたのコードは正常に実行されていますが、時間がかかっています。
  • サーバーは、リクエストにかかる時間を監視し、リクエストを強制終了して例外をスローします。

したがって、コードは実際にはその例外をスローしません。

これについて知りたい場合やログに記録したい場合は、ファイル内のApplication_Errorメソッドを使用できGlobal.asaxます (アクセスできると仮定すると、SharePoint でどのように機能するかはわかりません)。

たとえば、Web プロジェクトの 1 つで、キャッチされなかったエラーも含め、すべてのエラーをログに記録したいと考えていました。だから私がすることは次のようなものです:

protected void Application_Error(object sender, EventArgs e) {
    //Log ALL uncaught exceptions
    Exception exc = Server.GetLastError();
    if (exc is HttpUnhandledException) {
        exc = Context.Error.InnerException;
    }
    //Log error here
}

ログ以外にできることはあまりありません。ページのライフ サイクルのどこでこれが発生するかはわかりません。そのため、現在の HTTP 要求オブジェクトを取得してユーザーをリダイレクトするようなことができるかどうかはわかりません。

お役に立てれば。

于 2012-12-07T18:48:26.867 に答える
2

例外をキャッチしていますが、それは ThreadAbortException であるため、フレームワークは自動的に再スローしています。詳しくはこちらをご覧ください。

問題は、PDF キーワード検索コードが (場合によって) 指定された HTTP 実行タイムアウトよりも長くかかることです。Sharepoint のデフォルトのタイムアウトはわかりませんが、増やすことはできるはずです。

于 2012-12-07T18:40:52.207 に答える