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 项目中,我想记录所有错误,即使是没有被捕获的错误。所以我做的是这样的:

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 回答