🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: cn.bbs.comp.lang.java
Article #21462

С���쳣��Exception�������ķ���(2)

#21462
From: ��ɽ������,�ɾ����ѵ�
Date: Wed, 03 Dec 2003 12:14
221 lines
19350 bytes
 CSDN - �ĵ����� - Java     
  
����     С���쳣��Exception�������ķ���(2)    maqj�����룩 
  
�ؼ���     ����(Exception)����������� 
  
����     http://www.javaworld.com/javaworld/jw-10-2003/jw-1003-generics.html
? 
  


��Ҫ�������쳣
�ڸ��ӵ�����У���������һЩ�ض��Ĵ����ִ��ʱ���׳����ֲ�ͬ�쳣�ķ�������
̬װ��һ�����ʵ��һ�����󶼿��ܻ�������ͬ���쳣������ClassNotFoundException
, InstantiationException, IllegalAccessException, �� ClassCastException��

һ����æ�ij���Ա�������������ʱ���ܼ򵥵İѷ������ð���һ��ֻ�Ჶ������
��Exception��try/catch�飬��������ĸ���ͬ��catch�鵽try�����(�������
�����嵥��)���⿴�����ƺ��޿��÷�ȴ�����һЩ����ʶ�ĸ���Ч�����磬��
��className()��null,��ôClass.forName()�����׳�һ��NullPointerException��
��������������б���������������£�catch�齫������쳣��Ȼ���û����ȥ
��������һ���쳣��ֻ����ΪNullPointerException��RuntimeException��һ������
������RuntimeException����Exception��һ�����ࡣ����һ����ͨ��catch(Exception
 e)���Ჶ������RuntimeException�����࣬����NullPointerException, IndexOutOfBoundsException
, ��ArrayStoreException��ͨ����һ������Ա��������ȥ������Щ�쳣��
�ڴ����嵥3��,null��className�ᵼ��һ��NullPointerException�쳣�������
���ڵ��õķ�����������Ч��
�����嵥3

public SomeInterface buildInstance(String className) {   SomeInterface impl
 = null;   try {      Class clazz = Class.forName(className);      impl =
 (SomeInterface)clazz.newInstance();   }   catch (Exception e) {      log
error("Error creating class: " + className);   }   return impl;}

��һ��ʹ�÷��Ͳ����Ӿ�Ľ����������־��¼����Ϊcatch��֪��������һ������
���쳣��������Щ����Ա��������������ʱ�򣬲�ȡ��Ӽ����ֶ�ȥ�鿴�쳣
������(�����嵥4)�����������ʹ��catch���Ŀ���౳�롣
�����嵥4

catch (Exception e) {      if (e instanceof ClassNotFoundException) {    
     log.error("Invalid class name: " + className + ", " + e.toString());
      }      else {         log.error("Cannot create class: " + className
 + ", " + e.toString());      }   }

�����嵥5�ṩһ������IJ��������쳣�����ӣ�һЩ����Ա���ܻ�����Ȥ������
��instanceof���DZ������Ϊ���������쳣�Իᱻ����ÿһ���������쳣(ClassNotFoundException
, InstantiationException, IllegalAccessException) �ᱻ����ʹ��?����һ��
��װ����ȷ������ȴû��ʵ��SomeInterface�ӿ�����������������һ��ClassCastException
�쳣������쳣Ҳ�ᱻ��֤��
�����嵥5


public SomeInterface buildInstance(String className) {   SomeInterface impl
 = null;   try {      Class clazz = Class.forName(className);      impl =
 (SomeInterface)clazz.newInstance();   }   catch (ClassNotFoundException 
e) {      log.error("Invalid class name: " + className + ", " + e.toString
());   }   catch (InstantiationException e) {      log.error("Cannot create
 class: " + className + ", " + e.toString());   }   catch (IllegalAccessException
 e) {      log.error("Cannot create class: " + className + ", " + e.toString
());   }   catch (ClassCastException e) {      log.error("Invalid class type
, " + className         + " does not implement " + SomeInterface.class.getName
());   }   return impl;}

��ijЩ����£���õķ����������׳�һ����֪���쳣�����߽д���һ���µ��쳣��
������ͼȥ�ڵ�ǰ��������д��?��������÷���ͨ���������쳣��һ����֪
����������ȥ�������ִ������Ρ�

����Ĵ����嵥6�ṩ��һ��buildInterface()�������滻�汾�������װ���ʵ��
����ʱ�������⣬����汾���׳�һ��ClassNotFoundException�쳣�������������
�����÷�����ȷ���õ�һ����ȷ��ʵ����������һ���쳣��������÷����Ͳ���
Ҫȥ��鷵�صĶ����Ƿ�Ϊ���ˡ�
ע���������ʹ����Java 1.4�ķ���������һ���Ѿ���������쳣��װ���µ��쳣��
�Ա㱣��ԭʼ�Ķ�ջ������Ϣ�����򣬶�ջ���ٽ�ָ������buildInstance()������
�쳣��Դ������DZ�ڵ���newInstance()�׳����쳣��
�����嵥6

public SomeInterface buildInstance(String className)     throws ClassNotFoundException
 {   try {      Class clazz = Class.forName(className);      return (SomeInterface
)clazz.newInstance();   }   catch (ClassNotFoundException e) {      log.error
("Invalid class name: " + className + ", " + e.toString());      throw e;
   }   catch (InstantiationException e) {      throw new ClassNotFoundException
("Cannot create class: " + className, e);   }   catch (IllegalAccessException
 e) {      throw new ClassNotFoundException("Cannot create class: " + className
, e);   }   catch (ClassCastException e) {      throw new ClassNotFoundException
(className        + " does not implement " + SomeInterface.class.getName(
), e);   }}

����Щ����£���δ�������޷���ij�ִ���״̬�ָ�����ʱ������һ��������쳣
��ʹ������ָ��ij��״̬�Ƿ��ǿɻָ��ľͱ�ú���Ҫ�ˡ������������ֹ۵�ȥ����
���嵥6����ʵ������ӡ�

�ڴ����嵥7�У����className��Ч������᷵��һ��ȱʡ�Ķ��󣬲����׳�һ����
����ָ���Ƿ��IJ�������������ת�ͻ����Ȩ�޲�����
ע�⣺IllegalClassException��һϵ�е��쳣�࣬Ϊʾ����Ŀ�Ķ������ἰ����ע
��������Java��׼�����
�����嵥7

public SomeInterface buildInstance(String className)     throws IllegalClassException
 {   SomeInterface impl = null;   try {      Class clazz = Class.forName(
className);      return (SomeInterface)clazz.newInstance();   }   catch (
ClassNotFoundException e) {      log.warn("Invalid class name: " + className
 + ", using default");   }   catch (InstantiationException e) {      log.
warn("Invalid class name: " + className + ", using default");   }   catch
 (IllegalAccessException e) {      throw new IllegalClassException("Cannot
 create class: " + className, e);   }   catch (ClassCastException e) {   
   throw new IllegalClassException(className        + " does not implement
 " + SomeInterface.class.getName(), e);   }   if (impl == null) {      impl
 = new DefaultImplemantation();   }   return impl;}



ʲôʱ��Ӧ����һ�������쳣��
��ijЩ����²���һ�������쳣�ǿ��Եģ����統��ܱ����ұ���ȥ����һ��������
����ʱ����������dz����⣬�Ҷ��ڴ��͡�����ʧ�ܵ�ϵͳ��˵����Ҫ���ڴ�����
��8�У���һ����������ж�ȡ����˳���?���ǣ������󱻴���ʱ���������
���쳣����һ��BadRequestException���κ�RuntimeException�����࣬����NullpointerException
�������Ǹ��쳣�ͻᱻwhileѭ���ⲿ��������κδ��󶼻�����ѭ����ֹ����
�κ�ʣ������󶼲��ᱻ���?����ζ�����������ڼ�ȥ����һ��������һ�ֽϲ�
�����
�����嵥8


public void processAllRequests() {   Request req = null;   try {      while
 (true) {        req = getNextRequest();         if (req != null) {      
      processRequest(req); // throws BadRequestException         }       
  else {            // Request queue is empty, must be done              
break;         }      }   }   catch (BadRequestException e) {      log.error
("Invalid request: " + req, e);   }}

�����������һ�ֽϺõķ����Ƕ�����������߼���������Ҫ�ĸı䣬���ȣ���try
/catch�������������ѭ���С�����Ļ��κδ��󶼻���ѭ���ڲ�������ʹ��?
���Ҳ�������ѭ����ֹ�����ѭ������������󣬼�ʹһ������������ʧ�ܡ���
����������try/catch��ʹ��ȥ����һ�����͵��쳣�������κ��쳣����ѭ����
������������Ҳ���Լ����?�뿴��������嵥9��
�����嵥9��

public void processAllRequests() {   while (true) {      Request req = null
;      try {         req = getNextRequest();         if (req != null) {  
          processRequest(req); // Throws BadRequestException      }      
   else {            // Request queue is empty, must be done             
 break;         }      }      catch (Exception e) {         log.error("Error
 processing request: " + req, e);      }   }}


����һ�������쳣����������ֱ���뱾ƪ��ʼ�Ĺ۵���Υ����ȷʵ��ˡ����ǣ���ֻ
���ڷdz��dz�����ĵĻ����¡�����������£�����һ�����͵��쳣�Է�ֹһ������
���쳣��ֹ���ϵͳ���С�
������������¼���һ��ѭ���б����������£���ʹ�ڴ����ڼ����쳣���׳���
�Ǹ�ѭ������Ҫִ���Ա����ȥ���?
�ڴ����嵥9�У��ڴ���ѭ����try/catch�鱻��Ϊ�Ƕ����쳣�����ߣ�the top-level
 exception handler������������Ҫ����ͼ�¼������������뼶��������쳣����
���쳣û�б����ԣ�Ҳ���ᶪʧ�������쳣�����ж�������Ҫ���������

ÿ�����͡����ӵ�ϵͳ����һ�������쳣�����ߣ�������ÿһ����ϵͳ����ȡ����ϵ
ͳ�����ɴ���ģ��������쳣����������ȥ�޸����쳣�����DZ�����⣬��������
����ֹ���������²���ͼ�¼������⡣�Ⲣ���ǰ�ʾ���е��쳣��Ӧ���������
���׳����κ��쳣������ڽϵͼ��𱻴��?���Ӧ����ô������������쳣��
������ⷢ��ʱ��״̬�߼��ͻ�֪���ĸ�ࡣ���ǣ�����쳣�����ڽϵͼ��𱻴���
����ô�׳����߼�������������Щ���ɻָ��Ĵ��󶼽���һ�������?����
�쳣�����ߣ������DZ鼰���ϵͳ��

��Ҫ���������쳣
�����ڳ����嵥1�е�����������ڳ���Ա������cleanupEverything()������������
���쳣��ʼ�ģ����һ�������ú���������һ�������׳�6����ͬ�쳣ʱ����
������:����������õ�����⣬���÷���Ҳ���ò�������6����ͬ���쳣���������
�嵥10����
�����嵥10

public void cleanupEverything() throws      ExceptionOne, ExceptionTwo, ExceptionThree
,      ExceptionFour, ExceptionFive, ExceptionSix {   cleanupConnections(
);   cleanupFiles();   removeListeners();}public void done() {   try {   
   doStuff();      cleanupEverything();      doMoreStuff();   }   catch (
ExceptionOne e1) {      // Log e1   }   catch (ExceptionTwo e2) {      //
 Log e2   }   catch (ExceptionThree e3) {      // Log e3   }   catch (ExceptionFour
 e4) {      // Log e4   }   catch (ExceptionFive e5) {      // Log e5   }
   catch (ExceptionSix e6) {      // Log e6   }}

���ǣ���ʹ�����е����ң�ȴ�������ʹ�������쳣���Ա������ַdz���ʵ�����⣺
����һ������Exception������DZ�������ϸ�ڣ�����Ҳ��ʧȥ�˴�������֮���ڵ�
��ᡣ���һ��˵������һ�������쳣��ǿ���κε�������ķ����Ĵ���Ҫô������
�������쳣������ǰ��һ�����ַ��������⣩��Ҫô���������Ǹ������쳣������
�ⷶΧ��
�д���Ե��ǣ���һ�������������׳�һ�������쳣Exceptionʱ��������������
����������ԭ��֮һ��һ��ԭ���ǣ�������������˼�������ķ��������Ǽ�������
���ܻ���������಻ͬ���쳣�������ͣ��ģʽ������ģʽ�������������쳣״̬��
ϸ�ڡ���˲�����ʲô�����������ֻ�Ǽ򵥵���������׳�Exception������
������һ���쳣����װ�ڽϵͼ�����쳣��������һ�������ǣ��ڷ���ʵ�������
�����쳣Exception����throw new Exception())�ĵط�����Ϊ����Ա��Ϊ�쳣��ʵ
�ϲ�Ӧ�ñ���������������Ρ�

�������������ֻҪ��΢˼������ƣ��Ͷ��ɽ����ʲô��ϸ�ڣ���һ���쳣���Ӧ
�ñ������������ƿ��ܰ������������������������һЩȷʵ�ᷢ����쳣����
һ��ѡ���Ǵ���һ���쳣ȥ��װ�����������쳣�Ķ������ڴ��������£���������
�����쳣�����߽�һϵ���쳣��Ӧ�þ����ܵ���ϸ�����ָ���ϸ���쳣���ṩ����
�ڴ���״̬����Ϣ������������������α������������ϸ�ı���¼��

�����Exception�౻ѡ�У��Ǿ���ζ���κε���һ�������˻��׳�Exception����
�ķ�����Ҫô������������Ҳ���׳�Exception��Ҫô��װ�������������һ����
����Exception��try/catch���С��������ַ�����ǰ�������������⡣
С��ʹ�÷����쳣
��ƪ����̽���˴��?���쳣�ļ������棺������Զ����Ҫ��������Ҳ��Ӧ�����ԡ�
����Ӧ�ú��ٱ�����ֻ�ڷdz����������£������Dz����ṩ��ϸ��Ϣ��������ȥ
��Ч�Ĵ������ǣ������㲻����������ʱ��Ӧ��С�IJ����쳣��

�쳣��Java�е�һ��ǿ�����Ĺ��ߡ��������ȷʹ�ã�����ʹ���Ϊһ������Ч�ʵ�
����Ա������������Ŀ������ڣ��ر����ڲ��Ժ͵���ʱ�����쳣�������ʹ��ʱ��
�����ϵͳ�У�������������������ڣ����һ����һ�ε��ظ�������������Ҫ��ע
�������ĺ����ʹ�÷����쳣�� 


 

--
�������䣬��������
�������£������ĺ�
һ���񻰾����˻�һ��
һ���񻰾�������һ��
��ɢ�����㣬��ɢ������
���ҴҴҽԹ��

�� ��Դ:������δ��վ bbs.pku.edu.cn��[FROM: 162.105.40.117]
Technical Details
Message-ID: <49VETN$A0M@bbs.pku.edu.cn>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!newsfeed.news2me.com!elnk-nf2-pas!newsfeed.earthlink.net!sjc70.webusenet.com!news.webusenet.com!maily.cic.tsinghua.edu.cn!news.happynet.org!PKU

Show Full Headers
Complete Article Headers
X-Google-Language: Chinese,GB
X-Google-Thread: f6cb0,cecb458cee58af14,start
X-Google-Attributes: gidf6cb0,public
X-Google-ArrivalTime: 2003-12-03 04:15:15 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!newsfeed.news2me.com!elnk-nf2-pas!newsfeed.earthlink.net!sjc70.webusenet.com!news.webusenet.com!maily.cic.tsinghua.edu.cn!news.happynet.org!PKU
From: skyswind@bbs.pku.edu.cn (��ɽ������,�ɾ����ѵ�)
Newsgroups: cn.bbs.comp.lang.java
Subject: С���쳣��Exception�������ķ���(2) 
Date: 03 Dec 2003 12:14:51 GMT
Organization: ����δ��վ
Message-ID: <49VETN$A0M@bbs.pku.edu.cn>
Mime-Version: 1.0
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 8bit
X-Filename: Java/M.1070453639.A
Lines: 221