该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-09
这个是Anders Hejlsberg对于C#中没有checkedException的一次谈话 effective java 中也认为 checkedException 其实是鸡肋,C++中也没有checkedException,原因是,编程的终止模型。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-04-09
没有采用checked exception的后果就是,界面上总是不经意的跳出带有Delphi风格的异常对话框,这就是Delphi程序员和C#程序员的悲哀。程序员也总是搞不清楚自己调用的API有没有抛出异常,总是忘记捕获该捕获的异常。
|
|
返回顶楼 | |
发表时间:2004-04-10
对这种情况的处理,可以考虑模板方法,在模板方法里面统一进行一个try...catch,这样无论如何都可以有自定义的对话框用了:)
|
|
返回顶楼 | |
发表时间:2004-04-10
上次和 Ben 交流时我想过如果能用 AOP 的方式来处理 Exception 就最好了(就是让大部分 Exception 处理对程序员透明,程序员可以不关心这些处理,只关心业务逻辑的实现,这些处理由框架的开发者来解决)。只需要定义某类 Exception 的回调方法,一旦遇到这类 Exception 就调用相应的回调方法。这样程序里面就不需要到处写 try... catch... finally 了。不过这样可能也会引起一些问题,例如相同类型的 Exception 出现在不同的地方处理方法是不一样的,所以要给回调方法传递一个表示上下文的 Context 对象告诉它这个 Exception 出现在何处。
Checked Exception 由语言本身提供是完全有必要的。在 Java 中你也可以不用,把所有的 Exception 全部抛出来仅在最外层做处理。但是还是有些必须要用到 try... catch... finally 的场合,例如数据库连接的释放经常放在一段代码的 finally 中保证无论如何都会被释放。我想 C# 中应该也会有 try... catch... finally 的功能,但是因为完全可以不写,所以初学者往往从来也不写 try... catch... finally,这样就无法保证数据库连接肯定会被释放了。 |
|
返回顶楼 | |
发表时间:2004-04-11
dlee 写道 上次和 Ben 交流时我想过如果能用 AOP 的方式来处理 Exception 就最好了(就是让大部分 Exception 处理对程序员透明,程序员可以不关心这些处理,只关心业务逻辑的实现,这些处理由框架的开发者来解决)。只需要定义某类 Exception 的回调方法,一旦遇到这类 Exception 就调用相应的回调方法。这样程序里面就不需要到处写 try... catch... finally 了。不过这样可能也会引起一些问题,例如相同类型的 Exception 出现在不同的地方处理方法是不一样的,所以要给回调方法传递一个表示上下文的 Context 对象告诉它这个 Exception 出现在何处。
Checked Exception 由语言本身提供是完全有必要的。在 Java 中你也可以不用,把所有的 Exception 全部抛出来仅在最外层做处理。但是还是有些必须要用到 try... catch... finally 的场合,例如数据库连接的释放经常放在一段代码的 finally 中保证无论如何都会被释放。我想 C# 中应该也会有 try... catch... finally 的功能,但是因为完全可以不写,所以初学者往往从来也不写 try... catch... finally,这样就无法保证数据库连接肯定会被释放了。 C#采用类似于C++的栈对象的RAII释放资源。 例如C++里面你可以这样写 class Connection { private: DBconnection conn; public: Connection() { conn.connect(); } ~Connection() { conn.close() } } void dosmoething() { Connection conn;//自动关闭对象无论是否出现异常 //do something with exception } 这就是所谓的RAII idioms(Resource Acquisition Is Initialisation),因此对于C++来说finally 和check exception 在这个层面上没有显得毫无必要。 C#也有类似的机制; class Connection { private DBConnection conn; public dispose() { conn.close(); } } public void doSomething() { Connection conn; using(conn=new Connection()) { //dosomething with exception } // 退出using 自动执行dispose。 } 因此同样从Resource management的层面上C#和C++都不需要finally和check exception.当然从其他方面来说,例如接口签名的安全性和完整性来说 check exception 还是有它的好处。因为对于接口来说exception就是另外一种 返回值,既然返回值有强类型校验,那么exception也应该有。 |
|
返回顶楼 | |
发表时间:2004-04-11
robbin 写道 没有采用checked exception的后果就是,界面上总是不经意的跳出带有Delphi风格的异常对话框,这就是Delphi程序员和C#程序员的悲哀。程序员也总是搞不清楚自己调用的API有没有抛出异常,总是忘记捕获该捕获的异常。
hehe,Java 程序仅仅以一长串的stack trace作为代替。对于那些忘记捕捉的exception 来说,无论你是漏掉捕捉还是直接用Exception接掉效果都是一样的。因为该处理的错误你仍然没有处理。 |
|
返回顶楼 | |
发表时间:2004-04-11
引用 Java 程序仅仅以一长串的stack trace作为代替。对于那些忘记捕捉的exception 来说,无论你是漏掉捕捉还是直接用Exception接掉效果都是一样的。因为该处理的错误你仍然没有处理。
Java强制你catch,所以你不会忘记!当然那种无论什么方法只管throws Exception的程序员就该拉出去痛打了,这不是Java的错,而是程序员的错。 |
|
返回顶楼 | |
发表时间:2004-04-12
robbin 写道 引用 Java 程序仅仅以一长串的stack trace作为代替。对于那些忘记捕捉的exception 来说,无论你是漏掉捕捉还是直接用Exception接掉效果都是一样的。因为该处理的错误你仍然没有处理。
Java强制你catch,所以你不会忘记!当然那种无论什么方法只管throws Exception的程序员就该拉出去痛打了,这不是Java的错,而是程序员的错。 并不是每个Exception都有catch的必要。有些Exception是Bug例如null exception这些Exception是没有必要进行Catch的因为这些Exception即使 Catch了程序也不能正常工作,有些Exception是真正的异常程序需要catch出来进行容错处理例如网络断开。但是一个程序没有Run起来之前,程序员很难判别那些exception是bug,那些是异常;那些是需要Catch的,那些是不需要Catch的。往往都是先catch Exception,然后在Run的时候 根据Exception在应用中的地位选择性的进行catch。有些Exception因为解决了Bug就不存在了,有些Exception则表现为异常需要添加容错代码。 因此在我看来,Java的Check Exception一半是成功的,一半是鸡肋。 成功的一半是接口签名的throws校验,另外一半鸡肋则是throw Exception的时候必须申明接口签名. |
|
返回顶楼 | |
发表时间:2004-04-12
对于db资源的释放放在析构函数并不合适。
放在C#中这个Dispose也不合适 |
|
返回顶楼 | |
发表时间:2004-04-12
gKarerM 写道 对于db资源的释放放在析构函数并不合适。
放在C#中这个Dispose也不合适 怎么不合适?理由? |
|
返回顶楼 | |