王朝网络
分享
 
 
 

C / C++的和Java的异常机制

王朝java/jsp·作者佚名  2008-06-01
宽屏版  字体: |||超大  

程序总会出现异常的,需要我们去处理。C++和java都有自己异常机制,我们应该遵循着去处理异常。那它们的异常机制有何异同呢?

要注重一点:异常机制处理异常是要付出代价的,即异常处理的代码比无异常处理的要慢好多倍。

JAVA的异常机制

在面向对象的世界里,一切都是对象,JAVA的异常也不例外。API中异常类的“始祖”是 Throwable 类,有 Exception 类和 Error 类直接继续Throwable 。Error是很严重的,是不可拯救的,我们一般是通过继续Throwable 或Exception 来定义自己的异常类。

先看看API(这里是从1.5摘抄的)里的两个异常类是怎样的?

import java.io.*;

public class Throwable implements Serializable ...{

/** *//** use serialVersionUID from JDK 1.0.2 for interOperability */

PRivate static final long serialVersionUID = -3042686055658047285L;

/** *//**

* Native code saves some indication of the stack backtrace in this slot.

*/

private transient Object backtrace;

private String detailMessage;

private Throwable cause = this;

private StackTraceElement[] stackTrace;

public Throwable() ...{

fillInStackTrace();

}

public Throwable(String message) ...{

fillInStackTrace();

detailMessage = message;

}

public Throwable(String message, Throwable cause) ...{

fillInStackTrace();

detailMessage = message;

this.cause = cause;

}

public String getLocalizedMessage() ...{

return getMessage();

}

public Throwable getCause() ...{

return (cause==this ? null : cause);

}

public synchronized Throwable initCause(Throwable cause) ...{

if (this.cause != this)

throw new IllegalStateException("Can't overwrite cause");

if (cause == this)

throw new IllegalArgumentException("Self-causation not permitted");

this.cause = cause;

return this;

}

public String toString() ...{

String s = getClass().getName();

String message = getLocalizedMessage();

return (message != null) ? (s + ": " + message) : s;

}

private synchronized StackTraceElement[] getOurStackTrace() ...{

// Initialize stack trace if this is the first call to this method

if (stackTrace == null) ...{

int depth = getStackTraceDepth();

stackTrace = new StackTraceElement[depth];

for (int i=0; i < depth; i++)

stackTrace[i] = getStackTraceElement(i);

}

return stackTrace;

}

//......省略了一些

}

注重一点:异常类是可串行化的。

public class Exception extends Throwable {

static final long serialVersionUID = -3387516993124229948L;

public Exception() {

super();

}

public Exception(String message) {

super(message);

}

public Exception(String message, Throwable cause) {

super(message, cause);

}

public Exception(Throwable cause) {

super(cause);

}

}

一个简单例子:

public class MyException extends Exception

...{

MyException(String str)

...{

super(str);

}

}

public class MyTest

...{

public void f()throws MyException

...{

throw new MyException("f() exception");

}

}

public class Main

...{

public static void main(String[]args)

...{

try

...{

new MyTest().f();

}catch(MyException me)

...{

System.out.println(me);

}finally

...{System.out.println("finally");

}

}

}

假如可能发生多种异常时,可用多个catch语句捕捉不同类型的异常,从第一个catch开始匹配异常,假如异常是该类或该类的子类,则匹配。假如要匹配所有的异常,则在catch中捕捉 Throwable 类,因为其它所有异常类都是其子类,都可匹配。其中 finally块是程序必然会执行的块,除非JVM忽然退出了。

C++的异常机制

在C的时候,错误处理要 setjmp() / longjmp() 通过。而C++里, setjmp() / longjmp() 已经不能用了。C++的异常可以是类,也可以是基本类型(如int)。在标准库中,也存在exception类。但是,C++并没有要求我们自定义的异常要继续某个类。

一个简单例子:

#include<iostream>

using namespace std;

#ifndef NULL

#define NULL 0

#endif

class MyException

...{

const char * const msg;

public:

MyException(const char* const _msg=NULL):msg(_msg)...{};

void print()

...{

cout<<msg<<endl;

}

};

void f()

...{

throw MyException("something bad happened");

}

int main()

...{

try

...{

f();

}catch(MyException me)

...{

me.print();

}

system("pause");

return 0;

}

C++的异常捕捉匹配和JAVA的基本相同,只是C++没有 finally 块。要捕捉所有异常的方法是用 catch(...) 语句。

以上所述都只是JAVA和C++的异常机制的皮毛。对JAVA的异常,觉得自己理解得还可以,懂得什么是捕捉,什么是抛出异常、传播异常和包装异常等。但是对C++的异常,可以说是刚刚接触,刚才看了 Thinking in C++ 异常处理的一章。想起JAVA的异常机制,就作个对比,写个笔记。

QQread.com

推出游戏功略 http://www.qqread.com/netgame/game/index.Html

魔兽世界

跑跑卡丁车

街头篮球

水浒Q传

龙与地下城OL

征服

轩辕剑5

FIFA07

热血江湖

大唐风云

梦幻西游

武林外传

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有