论坛首页 Java企业应用论坛

什么是错误,什么是异常,Exception是干什么的

浏览 19242 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-05-17  
Error不是多余的。Error是JVM内部使用的Exception.他是用于内部错误处理的,由JVM捕获。
0 请登录后投票
   发表时间:2004-05-17  
那为什么不仅供内部使用。其实给我们也没有什么用,无论是什么Error,我们还是不会去捕获。增加一个Error派生的异常类层次除了更好看,并没有让出错提示更加有表达力,而且我一直觉得异常类层次根本就不用来表达什么,而是作为选择catch的标准。要表达错误,最有效果的就是尽可能堕的字符串描述。
其实没有必要继续讨论了,对于这种不用捕获的真正由破坏契约导致的错误,是Assert,还是抛异常,抛什么样的异常,完全由个人喜好和语言设计决定,能分清楚什么是真正的异常就足够了。
0 请登录后投票
   发表时间:2004-05-17  
taowen,
你可以问问作Java项目的,他们的项目里有没有自己的Exception类层次。

Error既然存在有它的道理。
也许有一天你会想捕获Error异常的,设置是Throwable异常。

如果你需要写

try{

....
}catch ( Trhowable t){

}

那么你就知道为什么有时候需要Error了。

面向对象的Exception就是为了减少if的使用和通过范绘值判断错误是什么的,这至少是主要功能之一。

我不想通过讨论改变你的喜好。我只是说说我知道的。

讨论很愉快。毕竟,很少有人提出这种质疑。
大部分人还在研究设计模式等。
0 请登录后投票
   发表时间:2004-05-17  
呵呵,其实就是因为我没做什么项目,所以才会这样傻傻的提出这样的质疑。所谓无知者无畏。
多谢slovenboy陪我进行无知的讨论。
0 请登录后投票
   发表时间:2004-05-18  
看来楼上几位兄弟的讨论,呵呵,我都被你们搞糊涂了.。你们有几个基本的理解上的错误啊~~~~~~
    在java中,有错误(Error)和异常(Exception)两种,错误是虚拟机内部产生,任何程序都不能捕捉的(不是像楼上某位兄台说的通过捕捉Throwable就可以捕捉的);而异常,是可以由程序进行捕捉的。
    现在我们再就Exception进行解释,一般说了,Exception分为两种,运行时异常(继承了RuntimeException)和非运行时异常。运行时异常一般说来就是程序的bug造成,比如数组越界啊,空指针啊,类装载错误啊。非运行时异常一般说来是由于客观因素造成(比如说访问网络超时,数据库访问出错等等),我们一般说来,都需要自行定义非运行异常,把它作为一种业务异常,一是对其他的异常进行封装,二是自行处理一些业务逻辑问题(比如说登陆用户名密码校验错误,某种业务逻辑不符合规则等等)。
    一个好的异常定义可以看出一个好的系统架构设计,所以值得各位朋友认真看看的。
0 请登录后投票
   发表时间:2004-05-21  
凤舞凰扬 写道
  在java中,有错误(Error)和异常(Exception)两种,错误是虚拟机内部产生,任何程序都不能捕捉的(不是像楼上某位兄台说的通过捕捉Throwable就可以捕捉的);而异常,是可以由程序进行捕捉的。
    现在我们再就Exception进行解释,一般说了,Exception分为两种,运行时异常(继承了RuntimeException)和非运行时异常。运行时异常一般说来就是程序的bug造成,比如数组越界啊,空指针啊,类装载错误啊。非运行时异常一般说来是由于客观因素造成(比如说访问网络超时,数据库访问出错等等),我们一般说来,都需要自行定义非运行异常,把它作为一种业务异常,一是对其他的异常进行封装,二是自行处理一些业务逻辑问题(比如说登陆用户名密码校验错误,某种业务逻辑不符合规则等等)。
    一个好的异常定义可以看出一个好的系统架构设计,所以值得各位朋友认真看看的。


对于错误和异常说的确实有误,Throwable 有两个子类Error 和Exception.
错误,不是不能捕捉,是不建议捕捉。

        try
        {           
            IFoo foo = ... // get an IFoo implementation
            foo.bar ();
        }
        catch (RuntimeException ioe)
        {
            // Handle 'ioe' ...
        }
        catch (Error e)
        {
            // Handle or re-throw 'e' ...
        }

这种代码是可以编译通过的吧?(理论上是没问题的)

因而是可以捕捉的。
0 请登录后投票
   发表时间:2004-06-05  
试验证明,楼上正确!我个人理解出错,呵呵
0 请登录后投票
   发表时间:2004-07-22  
从前一直不太会使用Exception,现在也开始定义一些自己的Exception了。因为我发现在多层结构中,你可以在最底层把错误信息用Exception给抛出,中间无论多少层什么也不要管,只要在最上层用try捕捉到在表示层显示出来给用户就可以了。
从前是每一层上都要用try来处理的,或者就是底层出错后只是中断流程转到错误的页面,而信息只记录在log中。呵呵,还是Exception的机制好。
0 请登录后投票
   发表时间:2004-08-04  
Error没用过,也没怎么见到有地方用Error去捕捉,有人有空讲讲
我同意凤舞的说法,一个设计良好的系统应该有一个良好的Exception机制
我的理解是Exception分RuntimeException和Exception两类

Exception是你程序中用来判断处理错误的原因,并在不同的层面上处理和转化。如凤舞所说,是逻辑业务或者是判断上的错误。程序可以根据这些错误在程序中进行判断处理,防止逻辑错误。

RuntimeException都是程序无法处理的从JVM丢出来的错误,在一定层面上会破化程序的运行,需要在一定的时候进行判断和处理,但与业务和逻辑无关。需要在运行期小心捕获防止程序异常崩溃。
0 请登录后投票
   发表时间:2004-08-04  
Error是肯定不必管的。
RuntimeException也不应该去捕获,因为这类的Exception都是不可恢复的,而且往往是因为程序的BUG才会导致这类Exception,比如说NullPoint,或者IndexOutOfBound等等。捕获这类Exception事实上是在隐藏错误。
普通的Exception应该用来描述可以恢复的错误(JDK中有一些EXCEPTION定义的就不好,比如说SQLException),而且根据界面的需要,可能需要再次包装,因为抛出Exception并不代表错误处理结束了,你还需要将错误信息在UI中显示出来,一个简单的UserNotFoundException是不够的。在一个支持国际化的项目中,甚至需要显示不同语言的错误信息。
所以,我通常是使用类似于Struts中的方式,写一个通用的MessageResourceException,能够根据语言的不同来显示正确的信息。有时候,也会写一些UserNotFoundException,但它是继承自MessageResourceException的。存在的目的只是预定义了一些信息,以及规范Exception的抛出而已。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics