1. Hintergrund
Der Artikel, den ich hier geschrieben habe, liegt daran, dass ein Freund gefragt hat, was der Unterschied zwischen der geprüften Ausnahme und der deaktivierten Ausnahme in Java. Meine Antwort darauf war: Ich benutze bei der Programmierung nur RunTimeException. Eigentlich habe ich eine Prämisse, wenn ich etwas sage. Ich sollte es genau sagen: Ich benutze oder achte auf RunTimeException nur, wenn ich in einem ausgereiften Entwicklungsrahmen in der Geschäftsordnung schreibe. Da Frameworks häufig die Ausnahmeregelung einheitlich einheitlich in Verbindung bringen, sodass Programmierer der Geschäftsordnung besser aufmerksam machen können und einige Geschäftsfehler normalerweise während des Systems des Systems auftreten, werden Geschäftsausnahmen normalerweise als Unterklassen der RunTimeexception konzipiert.
Meine Antwort kann meine Freunde offensichtlich nicht befriedigen! Denn egal wer ein Anfänger in Java ist, wir verwenden viel Versuch ... Fang ... Wenn wir IO -Kurse und JDBC -Programme lernen, erinnern wir uns an die Ausnahmen von Java! Anfänger wissen oft nicht, warum Java -Ausnahmen so gestaltet sind. Sie verarbeiten normalerweise nur Ausnahmen - drucken Sie einfach Ausnahmen im Fangblock aus, und die am häufigsten verwendete Anweisung ist:
E. printstacktrace ().
Wir haben auch Ausnahmen wie Speicher wie Array Crossing -Grenzen:
Java.lang.ArrayIndexoutofBoundSexception: 6
Dies wird uns auch dazu bringen, es frisch daran zu erinnern, weil es oft erscheint, wenn wir das Programm debuggen! Wir werden feststellen, dass diese Art von Ausnahme keinen Versuch verwenden muss ... fangen ... um sie im Code zu fangen.
Die beiden oben genannten Beispiele sind tatsächlich die geprüfte Ausnahme und die deaktivierte Ausnahme, die von einem Freund gefragt wurde. Die Ausnahme, die einen Versuch erfordert ... Fang ... ist die geprüfte Ausnahme, und die ungeprüfte Ausnahme ist die ungeprüfte Ausnahme. Wenn ich über ihre Unterschiede sprechen möchte, sage ich, dass einer von ihnen versuchen will ... Fang ... und der andere braucht es nicht. Ist diese Antwort in Ordnung? Ich denke, diese Antwort ist blass. Einige Schüler werden weiter sagen, dass es sich versuchen ... Catch ist offensichtlich ein Methodenanrufer, der die Ausnahme zwingt, ausdrücklich behandelt zu werden. Wird E. printstacktrace () die Verarbeitungsausnahmen in Betracht ziehen? Ich denke, das ist nur ein einfacher und fauler Weg, um damit umzugehen! Welche Art von Handhabungsmethode wird als klug angesehen? Der Java -Sprachdesigner erwartet tatsächlich, dass der Anrufer nach einer Ausnahme die Ausnahme im Fang wiederherstellen kann, damit das Programm weiterhin ausgeführt werden kann. "Smart Programmierer sind jedoch faul." Hehe. In den meisten Fällen entscheiden wir uns für die Aufzeichnungen von Protokollen und UI -Benutzern, nachdem die Ausnahme angezeigt wird. Später werde ich den Jersey -Framework kombinieren, um über die Einheit der einheitlichen Ausnahme zu sprechen. Nach dem Lesen werden einige Leute sagen, dass der Unterschied zwischen der geprüften Ausnahme und der deaktivierten Ausnahme darin besteht, dass einer verarbeitet und der andere nicht verarbeitet werden muss. Ist diese Antwort richtig? Ich finde es falsch! Mein Punkt ist: Wir müssen uns damit befassen, ob es sich um eine geprüfte Ausnahme oder eine ungeprüfte Ausnahme handelt!
Im vorherigen Absatz schienen wir den Unterschied zwischen geprüften Ausnahme und nicht kontrollierter Ausnahme immer noch nicht zu lösen. Ich denke nicht, dass es wichtig ist, die Antwort zu geben. Wichtig ist, wie wir mit diesen Ausnahmen umgehen und wie wir Ausnahmen während der Entwicklung verwenden.
Mein Punkt ist (Websystementwicklung):
1. Kapitulieren Sie die geprüfte Ausnahme auf der Framework -Ebene und konvertieren Sie sie in eine ungeprüfte Ausnahme, um zu vermeiden, dass ein mühsamer Versuch geschrieben wird. Fang Code während der Entwicklung.
2. Definieren Sie die Entwicklung auf Unternehmensebene, verschiedene RunTimeexceptions gemäß den Verantwortlichkeiten des Programmcodes (es handelt sich um eine ungeprüfte Ausnahme, die im Allgemeinen als Unterklasse von RunTimeException definiert ist).
3. In den ersten beiden Ansichten haben benutzerdefinierte Ausnahmen im System nur nicht überprüfte Ausnahmen, und das System befindet sich nur in der oberen Ebene des Client -Austauschs, richten Sie einen einheitlichen Ausnahmebehandlungsmechanismus ein und konvertieren einige Ausnahmen in Informationen, die Benutzer verstehen und an Benutzer übermitteln können.
4. Andere wie die Geschäftsschicht, die Datenpersistenzschicht usw. sind nur für Ausnahmen verantwortlich, aber achten Sie darauf, den Ausnahmestapel nicht zu verlieren (dies ist ein Fehler, den Anfänger anfällig für machen).
Der Hintergrund ist lang genug! Kommen wir zu dem Punkt und sehen Sie, wie der einheitliche Ausnahmebehandler des Jersey -Frameworks verwendet wird!
2. Einheitlicher Ausnahmebehandlung Mechanismus des Jersey -Frameworks
Es gibt die folgenden Vereinbarungen:
1. Das Beispiel verwendet Jersey1.x -Version
2. Springversion ist 2.5
3. Der Einfachheit halber verwendet das Beispielprojekt den Maven -Mechanismus nicht
Beispiel Business -Szenario Beschreibung:
1. Wir haben eine Eigenschaftenkonfigurationsdatei gelesen, und der Inhalt der Konfigurationsdatei lautet:
KEY1 = Hallo key2 = iteye.com
2. Starten Sie eine GET -Anfrage http: // localhost: 8888/a/ressourcen/test? N = 11, wobei N eine Zahl sein muss und weniger als 10 sein muss. Wenn n falsch ist, wird ein deaktivierter Ausnahmefehler erzeugt.
3. In diesem Beispiel wird in der Datenzugriffsschicht eine Datei gelesen, und ein geprüfte Ausnahmefehler wird auftritt, wenn die Datei gelesen wird.
Probenprojektstruktur Design
Code -Snippet Beschreibung
1. Datenspeicherdatei: Test.Properties
KEY1 = Hallo key2 = iteye.com
Dies ist die Datei, die wir lesen möchten, und zum Einfachheit halber handelt es sich um eine Eigenschaftendatei.
2. Datenzugriffsklasse: testdao.java
Paket com.iteye.redhacker.jersey.dao; import Java.io.ioException; import Java.io.inputstream; Import Java.net.url; Import Java.util.Properties; com.iteye.redhacker.jersey.exception.ExceptionCode;@Componentpublic class TestDao {public String saysHello() {ClassLoader classLoader = TestDao.class.getClassLoader();String iniFile = "com/iteye/redhacker/jersey/dao/test.properties";URL url = classloader.getResource (Inifile); InputStream IS; try {is = url.openstream ();} catch (ioException e) {neue DaoException (e, exceptioncode Properties ();} ort.load (url.openstream ());} catch (ioException e) {neue DaOException (e, exceptionCode.read_config_failed);} Schließlich {if (is! = Null) {try {is.close (); ExceptionCode.colse_file_failed);}}} return apre.getProperty ("key1") + "," + orte.getProperty ("key2");}}In dieser Klasse werden alle überprüften Ausnahmen in ungeprüfte Ausnahmen konvertiert (unsere benutzerdefinierte Ausnahme). Wenn Sie die Methode von Sayhello () anrufen, versuchen Sie es ... fangen ...
3.. Business -Implementierungsklasse: testService.java
paket com.iteye.redhacker.jersey.service; import org.springframework.bean.factory.annotation.autowired; com.iteye.redhacker.jersey.exception.ServiceException;@Componentpublic class TestService {@Autowiredprivate TestDao testDao;public String saysHello(int n) {// Business stipulates that n cannot be greater than 10 if (n > 10) {throw new ServiceException(ExceptionCode.MUST_BE_LESS_THAN_10);}return testdao.sayhello ();}/** * @param testdao the testdao zu setzen */public void dichstdao (testdao testdao) {this.testdao = testDao;}}In dieser Klasse machen wir eine geschäftliche Ausnahme unserer eigenen, was eine ungeprüfte Ausnahme darstellt.
HINWEIS: Wir haben die TestDaO -Klasse mit @autowired injiziert, eine Annotation, die von Spring bereitgestellt wird. Wir müssen eine festgelegte Methode zur Annotation der Attribute bereitstellen, andernfalls schlägt die Annotation fehl.
4. Anforderungszugriffsklasse anfordern: testResources.java
Paket com.iteye.redhacker.jersey.delegate; import javax.ws.rs.get; import javax.ws.rs.path; import Javax.ws.rs.Produces; import javax.ws.rs.queryparam; importieren Javax. com.sun.jersey.api.spring.Autowire;@Path("/test")@Autowirepublic class TestResources {private TestService testService;@GET@Produces(MediaType.TEXT_PLAIN)public String saysHello(@QueryParam("n") int n) {return testService.sayHello(n);}/** * @param testService the testService zum festen */public void dichstservice (testService testService) {this.TestService = testService;}}Hier ist eine von Jersey definierte Ressource. Auf diese Weise können wir auf diese Ressource zugreifen: Initiieren
HINWEIS: Wir haben verwendet @AutoWire ist keine Annotation für den Frühling, sondern eine Annotation für das Integrationspaket von Jersey-Srping. Wir müssen eine festgelegte Methode zur Annotation der Attribute bereitstellen, andernfalls schlägt die Annotation fehl.
5. Unified Exception Handler Class: ExceptionMappersupport.java
Paket com.iteye.redhacker.jersey.jaxrs; import javax.servlet.servletContext; import javax.servlet.http.httpsersquest; import Javax.ws.rs.core.context; javax.ws.rs.core.response.status; import javax.ws.rs.ext.exceptionMapper; import javax.ws.rs.ext.provider; import org.apache.log4j.logger; com.iteye.redhacker.jersey.exception.baseexception; import com.iteye.redhacker.jersey.exception.exceptionCode; import com.sun.jersey.api.notfoundException;/*** Unified Exception Handler*/@Providerpublic Class ExecTersupplements implementiert ExceptionMapperSplements implementiert ExceptionMaprements implementiert Ausnahmebetriebe. Logger.getLogger (exceptionMapperSupport.class); private statische String -String context_attribute = webapplicationContext.root_Web_Application_Context_atTribute; @ContextPrivate httpServletRetRecy -Anforderung; Handhabung*/public antwort tearsponse (Exception Exception) {String message = exceptionCode.internal_server_error; Status statusCode = status.internal_server_error; WebApplicationContext context = (WebApplicationContext) servletContext.getAtattribute (context_atTribute); // // basex -Ausnahme); baseException = (BaseException) exception;String code = baseException.getCode();Object[] args = baseException.getValues();message = context.getMessage(code, args, exception.getMessage(), request.getLocale());} else if (exception instanceof NotFoundException) {message = ExceptionCode.REQUEST_NOT_FOUND;statusCode = Status.not_found;} // Überprüfte Ausnahme und nicht überprüfte Ausnahmen werden im Protokoll logger.Error (Nachricht, Ausnahme) aufgezeichnet; return response.ok (meldung, mediatype.text_plain) .status (statusCode) .build ();}}In dieser Klasse kümmern wir uns um die nicht überprüfte Ausnahme, die wir definiert haben, und auch unbekannte Ausnahmen des Systems (einschließlich unbekannter ungeprüfter Ausnahmen und überprüfter Ausnahmen). Unsere Verarbeitungsmethode ist: a. Notieren Sie das Ausnahmebodus; B. Senden Sie einen Standard -HTTP -Standardfehler -Status -Code und eine Fehlermeldung an den Client, und der Client verarbeitet die Fehlerinformationen für sich selbst. Es ist erwähnenswert, dass diese Verarbeitungsmethode von Rest befürwortet wird und den HTTP -Standardstatuscode angemessen verwendet.
In dieser Klasse verwenden wir auch die internationale Konfigurationskomponente von Spring, um den vom System geworfenen Fehlerschlüssel zu internationalisieren, was für die Internationalisierung unseres Projekts förderlich ist.
6. benutzerdefinierte Ausnahme -Basisklasse: Basiexception.java
Paket com.iteye.redhacker.jersey.exception;/*** Ausnahme -Basisklasse, die Laufzeitausnahmen jedes Moduls werden aus dieser Klasse erbten / ** * Nachrichtenschlüssel */ privater String -Code; / ** * Meldungsparams */ privates Objekt [] Werte; / ** * @return den Code */ public String getCode () {return code; } / ** * @param Code Der Code zum Setzen von * / public void setCode (String -Code) {this.code = code; } / *** @return die Werte* / public Object [] getValues () {Rückgabewerte; } / ** * @Param -Werte Die Werte für * / public void setValues (Object [] Werte) {this.values = values; } public baseexception (String -Nachricht, Throwable Ursache, String -Code, Objekt [] Werte) {Super (Nachricht, Ursache); this.code = code; Dies.Values = Werte; }}Diese Klasse definiert die grundlegende Vorlage der Projektausnahmeklasse, und andere Ausnahmen erben daraus. Es ist erwähnenswert, dass es einige Funktionen der internationalen Konfiguration geschickt verwendet und sogar eine Fehlermeldung abgeben kann, die unten definiert ist, und die Fehlermeldung wiederverwenden, indem sie Parameter übergeben:
{0} {1} Parameterfehler
7. Andere Ausnahmen sind im Grunde genommen gleich, aber die Typen sind unterschiedlich. Schauen wir uns DaoException.java an
Paket com.iteye.redhacker.jersey.exception; öffentliche Klasse DAOException erweitert Baseexception {/** * Konstruktoren * * @param Code * Fehlercode */public DAOException (String -Code) {Super (Code, Null, Code, Null); {Super (Code, Ursache, Code, Null);}/** * Konstruktoren * * @param Code * Fehlercode * @param -Werte * Ein Satz von Ausnahmeinformationen anhängige Parameter */public DAOException (String -Code, Objekt [] Werte) {Super (Code, Null, Codes); Parameter */public DAOException (Throwable Ursache, String -Code, Objekt [] Werte) {Super (Code, Null, Code, Werte);} private statische endgültige lange Serialversionuid = -37112906139733714L;}Es erbt Basisexception. Wenn diese Ausnahme ausgelöst wird, fällen wir direkt vorläufige Urteile aus dem Ausnahmamen, und der Fehler stammt aus der DAO -Schicht.
8. Errmsg.Properties wird verwendet, um Ausnahmeinformationen zu definieren. Schauen wir uns an:
Read.File.Failed = Lesendatei fehlgeschlagen read.config.failed = Lesen Konfiguration Element fehlgeschlagen Must.be.less
III. Bereitstellung und Test
Sie können den Quellcode im Anhang dieses Artikels herunterladen. Überprüfen Sie nach dem Importieren von Eclipse den Quellcode.
Die Bereitstellung ist sehr einfach. Fügen Sie einfach Ihre Tomcat/config/server.xml hinzu:
<Host> ... <context path = "/a" reloadable = "true" docbase = "d:/wortspace/test/jerseyExceptionMapperTest/web"/> </host>
Starten Sie einfach Tomcat!
Machen Sie zwei Tests:
1.
2.
Für den ersten Test können Sie auch den folgenden Ausnahmefehler im Protokoll sehen:
[2013-08-15 00:25:55] [Fehler] Der Parameter muss weniger als 10com.iteye.redhacker.jersey.Exception.ServiceException: must.be.tel.than.10at com.iteye.redhacker.Jersey.Service.TestService.Sayhello (testservice.jersey) bei testsservice.java:20 sein. com.iteye.redhacker.jersey.delegate.Testresources.sayhello (testResources.java:21) at sun.reflect.nativemethodaccessorimpl.invoke0 (native Methode) bei sun.reflect.nativemethodaccessorimPl.Invoke (NATIVEMETHOCTICACACACACACACACACACACAILIMPL. sun.reflect.delegatingMethodaccessorimpl.invoke (delegatingMethodAccessorimpl.java:25) bei java.lang.reflect.method.invoke (method.java:597) bei com.sun.jersey.spi.container.javamethodinvokerFactory $ 1.invoke (Javamethodinvokerfactory.java:60) bei com.sun.jersey.spi.Container.javamethodinvokerFactory $ 1.invoke (javamethodinvokerfactory.java:60) ATINVOKE (Javamethodinvokerfactory.java:60) ATHOVAMETHOKTORTORTORTORTORTORTORTORTORTORY. com.sun.jersey.server.impl.model.method.dispatch.abstracttresourcemethodDispatchProvider $ typeoutInvoker._dispatch (AbstracttresourcemethodDispatchPatchProvider.java:185) at com.sun.jersey.server.impl.model.method.dispatch.resourcejavamethodDispatcher.Dispatch (ressourcenjavamethoddispatcher.java:75) at com.sun.jersey.server.impl.uri.rules.httpMethodru. com.sun.jersey.server.impl.uri.rules.righthandpatriule.accept (righthandpatriule.java:147) bei com.sun.jersey.server.impl.uri.RULES.ROOTRESOURCECLASSRULE.ACCECT (RootresourceClasse.javaRule com.sun.jersey.server.impl.application.webapplicationImpl._handlerquest (WebapplicationImpl.java:1483) bei com.sun.jersey.server.impl.Application.WebapplicationImpl._handLequest (WebapplicationImpl.Application. com.sun.jersey.server.impl.application.webapplicationImpl.handlerquest (WebapplicationImpl.java:1363) unter com.sun.jersey.server.impl.application.WebapplicationImpl.handLequest (WebapplicationImpl.java:1353)
Für andere Tests können Sie es ausprobieren, z. B. Tests zu löschen. Wenn die zu lesen nicht gefundene Datei gefunden werden kann, wird die überprüfte Ausnahme in eine selbstdefinierte ungeprüfte Ausnahme konvertiert und protokolliert sie, wobei der Standard-HTTP-Fehlerstatuscode und die Fehlerinformationen an den Client zurückgegeben werden.
4. Zusammenfassung
1. Es ist nicht schwierig, den Jersey -Framework zu durchsehen, dass wir in der Webprojektentwicklung die überprüfte Ausnahme und die deaktivierte Ausnahme so einheitlich wie möglich auf Rahmenebene behandelt haben, damit wir der Implementierung des Geschäfts mehr Aufmerksamkeit schenken können.
2. Wenn es sich um ein Nicht-Wir-Web-Projekt handelt, sollte der Programmarchitektur-Designer auch versuchen, Ausnahmen einheitlich zu bewältigen. Wenn es nicht einheitlich behandelt wird, sollten wir sie angemessen behandeln, anstatt einfach eine E. printstacktrace () zu machen, wenn eine geprüfte Ausnahme angetroffen wird. Wenn wir die Ausnahme nicht wiederherstellen können, sollten wir die Fehlerinformationen der Ausnahme in der Protokolldatei zumindest vollständig aufzeichnen, damit Fehler überprüft werden, wenn nachfolgende Programme fehlschlagen.
Volltext (Ende)