V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
alonezero
V2EX  ›  问与答

求救:一个 Apache commons-upload 使用过程中遇到的离奇问题?!?!

  •  
  •   alonezero · 2017-01-30 21:33:27 +08:00 · 1959 次点击
    这是一个创建于 2860 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题场景: Java Servlet 中利用 try_catch 捕捉异常,若发生异常则在 catchresponse.getWriter().writer("error!") 响应一句话。

    问题:如果发生 Java 自身提供的一些异常比如 Exception, ArithmeticException 等等,可以成功响应;但若发生 commons-upload 提供的异常比如 UploadException, FileSizeLimitExceededException 这些,则无法响应,request 转发也同样失效!!!浏览器信息:无法显示!

    这是咋回事啊?我查了老半天,别人也是这样写,真的把我搞懵逼了~求救啊!!!

    组件版本:

    • commons-fileupload-1.3.2
    • commons-io-2.5
    • tomcat-8
    • JDK8
    第 1 条附言  ·  2017-01-30 22:59:54 +08:00

    回复中贴的源码是出问题的源码。我描述的情况是实验了很多次得出的结论。

    这是实验的代码: 选择性的发生异常,观察后~我发生了这个离奇的问题,才来求救的

    sfu.setFileSizeMax(1024*1024);
    try {
    	items = sfu.parseRequest(request);
    	int i = 1/0;
    } catch (Exception e) {
    	if(e instanceof FileUploadBase.FileSizeLimitExceededException) {
    		System.out.println("异常啦!"+e.getMessage());
    		response.getWriter().write("上传响应了吗?");
    		return;
    	}
    	response.getWriter().write("/ by zero 响应了吗?");
    }
    // 如果发生文件大小限制异常,控制台打印了信息,但是无法响应;若 sfu解析请求无异常,1/0 引发了异常
    // 则可以成功响应!!!
    
    zhiyuan91
        1
    zhiyuan91  
       2017-01-30 22:15:30 +08:00
    代码怎么写的?
    alonezero
        2
    alonezero  
    OP
       2017-01-30 22:36:16 +08:00
    @zhiyuan91
    ``` java
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload sfu = new ServletFileUpload(factory);
    List<FileItem> fileItems = new ArrayList<FileItem>();
    sfu.setFileSizeMax(3*1024*1024); // 限制单个文件大小
    try {
    fileItems = sfu.parseRequest(request);
    } catch (FileUploadException e) {
    // throw new RuntimeException("文件上传失败~"+e.getMessage());
    response.getWriter().write("文件上传失败");
    return;
    }
    ```
    代码就是这样,就一个 try_catch 情况就是我说的那样。真的是见了鬼了
    NeinChn
        3
    NeinChn  
       2017-01-30 22:47:50 +08:00
    "如果发生 Java 自身提供的一些异常比如 Exception, ArithmeticException 等等,可以成功响应"
    但是代码贴的 catch 语句是:"catch (FileUploadException e) "
    ArithmeticException 不可能被 Catch 住的,楼主你这到底在表达什么...
    alonezero
        4
    alonezero  
    OP
       2017-01-30 22:48:45 +08:00
    @NeinChn 代码我改过好过次了。那是实验出来的结论
    codingadog
        5
    codingadog  
       2017-01-30 22:49:02 +08:00 via iPhone
    这个 catch 的 exception 类型不大对啊……
    alonezero
        6
    alonezero  
    OP
       2017-01-30 22:50:35 +08:00
    @NeinChn 我是直接 catch Exception 实验的。发生 Java 自身提供的可以响应。发生 fileupload 里的异常就无法响应。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:00 · PVG 18:00 · LAX 02:00 · JFK 05:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.