繁体   English   中英

HttpServlet抛出的GWT捕获异常

[英]GWT Catching exception thrown by HttpServlet

如果文件太大,则从服务器代码(在HttpServlet中)抛出异常:

 public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
 ...
 // Check if the blob has correct size, otherwise delete it
 final BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey);
 long size = blobInfo.getSize();
 if(size > 0 && size <= BasicConstants.maxImageSize){
    res.sendRedirect("/download?blob-key=" + blobKey.getKeyString());
 } else { // size not allowed
    bs.delete(blobKey);
    throw new RuntimeException(BasicConstants.fileTooLarge);
 }

在客户端代码中,我缺少使用此代码段成功捕获异常的方法:

try {
    uploadForm.submit(); // send file to BlobStore, where the doPost method is executed
} catch (Exception ex) {
    GWT.log(ex.toString());
}

但是,从这个其他客户端代码片段中,我以某种方式检测到何时以我完全不信任的丑陋解决方法引发了异常:

uploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {

    @Override
public void onSubmitComplete(SubmitCompleteEvent event) {
// This is what gets the result back - the content-type *must* be
// text-html
String imageUrl =event.getResults();

    // This ugly workaround apparently manages to detect when the server threw the exception
if (imageUrl.length() == 0) { // file is too large
  uploadFooter.setText(BasicConstants.fileTooLarge);
} else { // file was successfully uploaded
       ...
    }

Eclipse中的“开发模式”视图报告“未捕获的异常”类型的错误,这表明我在检测它方面确实做得不好。

谁能告诉我如何正确捕获异常,以及我使用的解决方法是否有意义?

谢谢!

您的第一次尝试

try {
    uploadForm.submit(); // send file to BlobStore, where the doPost method is executed
} catch (Exception ex) {
    GWT.log(ex.toString());
}

不起作用,因为submit()不会等到浏览器收到响应(这是一个异步调用)。

uploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {

  @Override
  public void onSubmitComplete(SubmitCompleteEvent event) {
    ...

在这里,您实际上收到了服务器的响应。 但这是表单提交,而不是GWT-RPC调用,因此结果只是纯文本,而不是GWT Java对象。

当您在Servlet中抛出RuntimeException时,服务器将仅发送带有错误代码的响应(可能为“ 500”,但理想情况下,请使用Firebug或Chrome开发者工具中的“网络”标签查看实际的响应和响应代码。)因此,在成功的情况下,您将获得URL,否则响应为空。

可能的解决方案

您可以在服务器端捕获异常,并显式发送更好的描述:

public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

  try {

      ...
      if (...) {
        throw new MyTooLargeException();
      } else {
          ...
        res.getWriter().write("ok " + ...);
      }

  } catch (MyTooLargeException e) {
     res.getWriter().write("upload_size_exceeded"); // just an example string 
                                                    // (use your own)

     res.sendError(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
  }
}

然后,在客户端上,检查

"upload_size_exceeded".equals(event.getResults()).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM