JFinal 异常处理

一千年前的人 发布于 2012/07/26 16:47
阅读 6K+
收藏 3

@JFinal 你好,想跟你请教1个问题:

能给一个exception处理机制吗?

目前发现 Validator 里面有一点机制, 但是仅仅限于Validate。

异常通常是就直接: 500 Internal Server Error 页面了

期望的效果是: 哪个页面出错, 就停在哪里页面, 但是提示出错误信息。 并且有时候, 根据业务需要, 会主动抛出业务异常, 这些都需要在页面上显示。 


以下是问题补充:

@一千年前的人:异常处理:哪个页面出错, 就停在哪个页面, 此时就原表单信息 和 错误信息 展示出来。 需要跳转到其他页面的是极少数。 所以需要一个异常处理机制, 让实现这个目标的代码尽量少。 (2012/07/26 17:35)
@一千年前的人:提出这个需求是基于过去的, 感觉得比较好的practice.... (2012/07/26 17:49)
加载中
1
JFinal
JFinal

非常有价值的问题  

1:如果你的 action 使用了 Validator,并且在 validate 方法中有异常是不会跳转到 error 500 页面的。跳到 error 500 的情况是异常在action或interceptor中发生了。

2:使用Validator时,如果需要在哪个页面出错,仍回到哪个页面的功能早已存在了,只不过需遵守约定,即:view = methodName + view扩展名。

3:页面跳转方面除了上面的约定以外 JFinal 还可以让开发者在 handlerError 指定跳转的去处,这样灵活性更高。

4:原表单的信息保持功能也有,如此办理:controller.keepPara();

    总的来说,JFinal 的 Validator 已经实现了此贴中需要的所有功能,只不过使用的时候需要来点约定,如果没有约定,就需要手动去调用一下方法,也就一行代码的事。虽然代码增加了一两行,但适应性与灵活性都大大加强了。如果 JFinal 的Validator仍然不能满足需求的话,自定义一个自全局拦截器实现整个系统的异常管理也非常的方便。

     再次感谢提出这么深入的问题,此问题深入到了 JFinal 的设计层面,是作者在设计时无时不刻都在权衡的问题 :)

0
CQRS恶棍
CQRS恶棍
一般异常都希望跳到一张其它页面去 避免重复发生异常,所以只要把 500页面的内容换一下就可以了!而且异常的对象是可以在500页面取到 的!
0
cwledit
cwledit
一路向外抛 配置一个拦截器 统一抓异常 显示到一张异常处理的页面上. 可以参考OSC的异常处理页面 将异常信息发送邮件通知
0
a
alvinte

500这种程序异常不应该在客户端显示吧,数据的错误交给validator处理正合适。

而且JFinal支持自定义500页面,可以提供人性化的展示,这也是很多网站的做法。

至于业务异常可以在controller里面自己捕获然后setAttr,在页面自己处理显示。

个人感觉JFinal对于框架应该做的事,基本都处理到位了。

个人观点,仅供参考~~

0
一千年前的人
一千年前的人

引用来自“农夫三拳”的答案

一般异常都希望跳到一张其它页面去 避免重复发生异常,所以只要把 500页面的内容换一下就可以了!而且异常的对象是可以在500页面取到 的!

不太合理.....

写了一个篇博客、表单, 提交时失败了(无论任何原因), 跳转到 其他页面。 就白打字了, 保存、修改的机会都没有了。

a
alvinte
回复 @一千年前的人 : 不太明白主动抛出异常是啥状况呢?个人认为只要是数据上的问题,validator应该都包办了,比如范围,长度,类型等等。
一千年前的人
一千年前的人
回复 @alvinte : 不够的。。 我会主动抛出异常的。。
a
alvinte
这种场景不是validator就足够处理了么?
0
一千年前的人
一千年前的人

引用来自“alvinte”的答案

500这种程序异常不应该在客户端显示吧,数据的错误交给validator处理正合适。

而且JFinal支持自定义500页面,可以提供人性化的展示,这也是很多网站的做法。

至于业务异常可以在controller里面自己捕获然后setAttr,在页面自己处理显示。

个人感觉JFinal对于框架应该做的事,基本都处理到位了。

个人观点,仅供参考~~

是的。 所以 JFinal 需要设计一个异常机制。

因为这个部分完全自己处理的话, 会有很多关于异常处理的 重复代码。

能统一处理的, 尽量统一处理。

0
galaxy58
galaxy58

看了楼主的需求,觉得用 Validator 还是最合适的

0
一千年前的人
一千年前的人
	protected void handleError(Controller controller) {
		controller.keepModel(Blog.class);
		
		String actionKey = getActionKey();
		if (actionKey.equals("/blog/save"))
			controller.render("add.html");
		else if (actionKey.equals("/blog/update"))
			controller.render("edit.html");
	}

Validator  这部分代码也是冗余的, 那个页面出错, 就停在哪个页面。

a
alvinte
可以用JFinal的约定,就不会有代码冗余。即方法名和模板文件名一致。
0
一千年前的人
一千年前的人

引用来自“galaxy58”的答案

看了楼主的需求,觉得用 Validator 还是最合适的

你尝试下, save db 时, 字段长度溢出, 就会跑到 500 页面了。 或者 我主动抛出 一个异常...
返回顶部
顶部