WEB开发网
开发学院软件开发C++ C / C++的和Java的异常机制 阅读

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

 2008-03-08 12:26:47 来源:WEB开发网   
核心提示: 程序总会出现异常的,需要我们去处理,C / C++的和Java的异常机制,C++和java都有自己异常机制,我们应该遵循着去处理异常,想起JAVA的异常机制,就作个对比,那它们的异常机制有何异同呢? 要注重一点:异常机制处理异常是要付出代价的,即异常处理的代码比无异常处理的要慢好多倍
  程序总会出现异常的,需要我们去处理。C++和java都有自己异常机制,我们应该遵循着去处理异常。那它们的异常机制有何异同呢?    要注重一点:异常机制处理异常是要付出代价的,即异常处理的代码比无异常处理的要慢好多倍。 JAVA的异常机制    在面向对象的世界里,一切都是对象,JAVA的异常也不例外。API中异常类的“始祖”是 Throwable  类,有 Exception 类和 Error 类直接继续Throwable  。Error是很严重的,是不可拯救的,我们一般是通过继续Throwable  或Exception 来定义自己的异常类。    先看看API(这里是从1.5摘抄的)里的两个异常类是怎样的? C / C++的和Java的异常机制(图一)import java.io.*;
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)public class Throwable implements Serializable ...{
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  /** *//** use serialVersionUID from JDK 1.0.2 for interOperability */
C / C++的和Java的异常机制(图六)  PRivate static final long serialVersionUID = -3042686055658047285L;
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  /** *//**
C / C++的和Java的异常机制(图六)   * Native code saves some indication of the stack backtrace in this slot.
C / C++的和Java的异常机制(图七)   */
C / C++的和Java的异常机制(图六)  private transient Object backtrace; 
C / C++的和Java的异常机制(图六)  private String detailMessage;
C / C++的和Java的异常机制(图六)  private Throwable cause = this;
C / C++的和Java的异常机制(图六)  private StackTraceElement[] stackTrace;
C / C++的和Java的异常机制(图六)  
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public Throwable() ...{
C / C++的和Java的异常机制(图六)    fillInStackTrace();
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public Throwable(String message) ...{
C / C++的和Java的异常机制(图六)    fillInStackTrace();
C / C++的和Java的异常机制(图六)    detailMessage = message;
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public Throwable(String message, Throwable cause) ...{
C / C++的和Java的异常机制(图六)    fillInStackTrace();
C / C++的和Java的异常机制(图六)    detailMessage = message;
C / C++的和Java的异常机制(图六)    this.cause = cause;
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public String getLocalizedMessage() ...{
C / C++的和Java的异常机制(图六)    return getMessage();
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public Throwable getCause() ...{
C / C++的和Java的异常机制(图六)    return (cause==this ? null : cause);
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public synchronized Throwable initCause(Throwable cause) ...{
C / C++的和Java的异常机制(图六)    if (this.cause != this)
C / C++的和Java的异常机制(图六)      throw new IllegalStateException("Can't overwrite cause");
C / C++的和Java的异常机制(图六)    if (cause == this)
C / C++的和Java的异常机制(图六)      throw new IllegalArgumentException("Self-causation not permitted");
C / C++的和Java的异常机制(图六)    this.cause = cause;
C / C++的和Java的异常机制(图六)    return this;
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  public String toString() ...{
C / C++的和Java的异常机制(图六)    String s = getClass().getName();
C / C++的和Java的异常机制(图六)    String message = getLocalizedMessage();
C / C++的和Java的异常机制(图六)    return (message != null) ? (s + ": " + message) : s;
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  private synchronized StackTraceElement[] getOurStackTrace() ...{
C / C++的和Java的异常机制(图六)    // Initialize stack trace if this is the first call to this method
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)    if (stackTrace == null) ...{
C / C++的和Java的异常机制(图六)      int depth = getStackTraceDepth();
C / C++的和Java的异常机制(图六)      stackTrace = new StackTraceElement[depth];
C / C++的和Java的异常机制(图六)      for (int i=0; i < depth; i++)
C / C++的和Java的异常机制(图六)        stackTrace[i] = getStackTraceElement(i);
C / C++的和Java的异常机制(图七)    }
C / C++的和Java的异常机制(图六)    return stackTrace;
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六)//......省略了一些
C / C++的和Java的异常机制(图八)}
C / C++的和Java的异常机制(图一)
注重一点:异常类是可串行化的。 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);
  }
} 一个简单例子:
C / C++的和Java的异常机制(图一)public class MyException extends Exception
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)MyException(String str)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  ...{
C / C++的和Java的异常机制(图六)  super(str);
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图八)}
C / C++的和Java的异常机制(图一)
C / C++的和Java的异常机制(图一)public class MyTest
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)public void f()throws MyException
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  ...{
C / C++的和Java的异常机制(图六)  throw new MyException("f() exception");
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图八)}
C / C++的和Java的异常机制(图一)public class Main
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)  public static void main(String[]args)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  ...{
C / C++的和Java的异常机制(图六)    try
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)    ...{
C / C++的和Java的异常机制(图六)      new MyTest().f();
C / C++的和Java的异常机制(图七)    }catch(MyException me)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)    ...{
C / C++的和Java的异常机制(图六)      System.out.println(me);
C / C++的和Java的异常机制(图七)    }finally
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)    ...{System.out.println("finally");
C / C++的和Java的异常机制(图七)    }
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图八)}
   假如可能发生多种异常时,可用多个catch语句捕捉不同类型的异常,从第一个catch开始匹配异常,假如异常是该类或该类的子类,则匹配。假如要匹配所有的异常,则在catch中捕捉 Throwable 类,因为其它所有异常类都是其子类,都可匹配。其中 finally块是程序必然会执行的块,除非JVM忽然退出了。 C++的异常机制    在C的时候,错误处理要 setjmp() / longjmp() 通过。而C++里, setjmp() / longjmp() 已经不能用了。C++的异常可以是类,也可以是基本类型(如int)。在标准库中,也存在exception类。但是,C++并没有要求我们自定义的异常要继续某个类。 一个简单例子: C / C++的和Java的异常机制(图一)#include<iostream>
C / C++的和Java的异常机制(图一)using namespace std;
C / C++的和Java的异常机制(图一)
C / C++的和Java的异常机制(图一)#ifndef NULL
C / C++的和Java的异常机制(图一)#define NULL 0
C / C++的和Java的异常机制(图一)#endif
C / C++的和Java的异常机制(图一)class MyException
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)   const char * const msg;
C / C++的和Java的异常机制(图六)   public:
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)       MyException(const char* const _msg=NULL):msg(_msg)...{};
C / C++的和Java的异常机制(图六)       void print()
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)       ...{
C / C++的和Java的异常机制(图六)         cout<<msg<<endl;
C / C++的和Java的异常机制(图七)       }
C / C++的和Java的异常机制(图八)};
C / C++的和Java的异常机制(图一)void f()
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)   throw MyException("something bad happened");
C / C++的和Java的异常机制(图八)}
C / C++的和Java的异常机制(图一)
C / C++的和Java的异常机制(图一)int main()
C / C++的和Java的异常机制(图二)C / C++的和Java的异常机制(图三)...{
C / C++的和Java的异常机制(图六)  try
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  ...{
C / C++的和Java的异常机制(图六)  f();
C / C++的和Java的异常机制(图七)  }catch(MyException me)
C / C++的和Java的异常机制(图四)C / C++的和Java的异常机制(图五)  ...{
C / C++的和Java的异常机制(图六)  me.print();
C / C++的和Java的异常机制(图七)  }
C / C++的和Java的异常机制(图六) system("pause");
C / C++的和Java的异常机制(图六) return 0;
C / C++的和Java的异常机制(图八)}
   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 热血江湖 大唐风云 梦幻西游 武林外传

Tags:Java 异常 机制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接