1. Фон
Статья, которую я написал здесь, потому что друг спросил, в чем разница между проверенным исключением и неконтролированным исключением в Java. Мой ответ на это был: я использую Runtimeexception только при программировании. На самом деле, у меня есть предпосылка, когда я что -то говорю. Я должен сказать это именно: я использую или обращаю внимание на Runtimeexception только при написании бизнес -кода в рамках зрелой структуры разработки. Поскольку, поскольку фреймворки часто инкапсулируют обработку исключений, так же, так как программисты могут уделять больше внимания бизнес -коду, а некоторые бизнес -ошибки обычно возникают во время пробега системы, бизнес -исключения обычно предназначены как подклассы Runtimeexception.
Мой ответ, очевидно, не может удовлетворить моих друзей! Потому что, независимо от того, кто является новичком в Java, мы используем много попыток ... поймать ... Когда мы изучаем классы IO и программирование JDBC, такая повторяющаяся попытка ... поймать нас запомнить исключения Java! Новички часто не знают, почему исключения Java предназначены таким образом. Обычно они просто обрабатывают исключения просто - просто распечатайте исключения в блоке подъема, и наиболее часто используемым утверждением является:
e.printstacktrace ().
У нас также есть исключения, такие как память, такие как границы пересечения массива:
java.lang.arrayindexoutofboundsexception: 6
Это также заставит нас запомнить это свежим, потому что это часто появляется, когда мы отлаживаем программу! Мы обнаружим, что этот тип исключения не должен использовать Try ... поймать ... чтобы поймать его в коде.
Приведенные выше два примера на самом деле являются проверенным исключением и неконтролируемым исключением, спросили другом. Исключение, которое требует попытки ... уловить ... это проверенное исключение, и неконтролируемое исключение - неконтролируемое исключение. Если я хочу поговорить об их различиях, я говорю, что один из них хочет попробовать ... поймать ... а другой не нужен. Этот ответ хорошо? Я думаю, что этот ответ бледный. Некоторые студенты также скажут, что Try ... Catch - это, очевидно, вызывающий метод, который заставляет исключение быть выброшенным явно. E.printstackTrace () рассматривается исключения для обработки? Я думаю, что это просто простой и ленивый способ справиться с этим! Так какой метод обработки считается умным? Дизайнер Java Language фактически ожидает, что после того, как произойдет исключение, вызывающий абонент может восстановить исключение в уловке, чтобы программа могла продолжать выполнять. Однако «умные программисты ленивы». Хе -хе. В большинстве случаев мы решили записывать журналы и пользовательские подсказки пользовательского интерфейса после появления исключения. Позже я объединю рамку Джерси, чтобы рассказать об единой обработке исключений. Прочитав это, некоторые люди скажут, что разница между проверенным исключением и неконтролированным исключением заключается в том, что нужно обрабатывать, а другой не нужно обрабатывать. Этот ответ правильный? Я думаю, что это неправильно! Моя точка зрения: мы должны иметь дело с этим, является ли это проверенным исключением или неконтролируемым исключением!
В предыдущем абзаце мы все еще не решали разницу между проверенным исключением и неконтролируемым исключением. Я не думаю, что важно дать ответ. Важно то, как мы справляемся с этими исключениями и как мы используем исключения во время разработки.
Моя точка зрения (разработка веб -системы):
1. Инкапсулируйте проверенное исключение на уровне структуры и преобразуйте его в неверное исключение, чтобы не писать утомительную попытку ... поймать код во время разработки.
2. Развитие на уровне бизнеса, определите различные Runtimeexceptions в соответствии с обязанностями кода программы (это неконтролируемое исключение, обычно определяемое как подкласс Runtimeexception)
3. Через первые два представления, пользовательские исключения в системе будут иметь только неконтролируемые исключения, и система будет находиться только на верхнем уровне клиентских данных, настраивая единый механизм обработки исключений и преобразовать некоторые исключения в информацию, которые пользователи могут понимать и передавать пользователям.
4. Другие, такие как бизнес -уровень, уровень постоянства данных и т. Д., Ответственности только за бросание исключений, но будьте осторожны, чтобы не потерять стек исключений (это ошибка, которую начинающие склонны к созданию).
Фон достаточно длинный! Давайте доберемся до сути и посмотрим, как используется единый обработчик исключений в рамках Джерси!
2. Объединенное механизм обработки исключений рамки Джерси
Есть следующие соглашения:
1. Пример использует версию Jersey1.x
2. Весенняя версия 2,5
3. Для простоты проект выборки не использует механизм Maven
Пример бизнес -сценария Описание:
1. Мы читаем файл конфигурации свойств, а содержимое файла конфигурации:
key1 = hello key2 = iteye.com
2. Начните запрос GET http: // localhost: 8888/a/resources/test? N = 11, требуя n, чтобы быть числом и должно быть менее 10. Если n неверно, будет сгенерирована ошибка непревзойденной исключения.
3. В этом примере уровень доступа к данным будет считывать файл, и будет произойдет проверенная ошибка исключения, если файл будет считан.
Образец проекта структуры проекта
Описание фрагмента кода
1. Файл хранения данных: test.properties
key1 = hello key2 = iteye.com
Это файл, который мы хотим прочитать, и для простоты это файл свойств.
2. Класс доступа к данным: testdao.java
Пакет com.iteye.redhacker.jersey.dao; импорт java.io.ioexception; импорт java.io.inputstream; import java.net.url; импорт java.util.properties; импорт org.springframework.stepolyte.component; импорт. 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"; ClassLoader.getResource (inifile); inputStream IS; try {is = url.OpenStream ();} catch (ioException e) {бросить новое daoException (e, exceptionCode.read_file_failed);} Свойства propert = null; try {if (propect = null) {Suppor);} Properties ();} proble.load (url.openstream ());} catch (ioException e) {бросить новое daoexception (e, exceptioncode.read_config_failed);} Наконец {if (is! = Null) {try {is.close (); is = nul ExceptionCode.colse_file_failed);}}} return proble.getproperty ("key1") + "," + proful.getProperty ("key2");}}В этом классе все проверенные исключения преобразуются в неконтролируемые исключения (наше пользовательское исключение). При вызове метода sayhello () попробуйте ... поймать ...
3. Класс внедрения бизнеса: testservice.java
пакет com.iteye.redhacker.jersey.service; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotyle.component; импорт com.iteye.redhacker.jersey.dao.testdao; импорт. com.iteye.redhacker.jersey.exception.serviceException; @ComponentPublic Class TestService {@AutowireDPrivate TestDao TestDao; public String SayShello (int n) {// Бизнес утверждает, что n не может быть больше, чем 10 if (n> 10) {Thress New ServiceException. testdao.sayhello ();}/** * @param testdao testdao для установки */public void settestdao (testdao testdao) {this.testdao = testdao;}}В этом классе мы бросаем собственное бизнес -исключение, что является неконтролируемым исключением.
Примечание. Мы вводили класс TestDao с использованием @Autowired, который является аннотацией, предоставленной весной; Мы должны предоставить устанавливающий метод для аннотирования атрибутов, в противном случае аннотация потерпит неудачу.
4. Запрос класс доступа: testresources.java
Пакет com.iteye.redhacker.jersey.delegate; импорт javax.ws.rs.get; import javax.ws.rs.path; import javax.ws.rs.produces; импорт javax.ws.rs. queryparam; importhax.ws.rs.core. com.sun.jersey.api.spring.autowire; @path ("/test")@autowirepublic class testresources {private testservice testservice;@get@provectes (mediatype.text_plain) public String sayshello (@queryparam ("n") int n) {return testserse.shello (@queryparam ("n"). Проверка службы проверки для установки */public void settestService (TestService TestService) {this.TestService = testService;}}Вот ресурс, определяемый Джерси. Мы можем получить доступ к этому ресурсу таким образом: инициировать запрос GET, получить доступ к URI /ресурсам /тесту и передать параметр запроса n, например: /ресурсы /тест? N = 1
Примечание: мы использовали @autowire не является аннотацией для весны, это аннотация для интеграционного пакета, сбрасывающих майки; Мы должны предоставить устанавливающий метод для аннотирования атрибутов, в противном случае аннотация потерпит неудачу.
5. Unified Exception Handler Class: ExceptionMapperSupport.java
пакет com.iteye.redhacker.jersey.jaxrs; import javax.servlet.servletcontext; импорт javax.servlet.http.httpservletrequest; импорт javax.ws.rs.core.context; импорт javax.ws.core.mediatype; javax.ws.rs.core.response.status; импорт javax.ws.rs.ext.exceptionmapper; import javax.ws.rs.ext.provider; импорт org.apache.log4j.logger; импорт org.springframework.web.context.webappicationContext; com.iteye.redhacker.jersey.exception.baseexception; import com.iteye.redhacker.jersey.exception.exceptionCode; import com.sun.jersey.api.notfoundexception;/*** Unified Exception Handler*/@@providerpublic exceptionMapperscuper Logger.getLogger (exceptionMapperSupporport.class); частная статическая конечная строка context_attribute = webapplicationcontext.root_web_application_context_attribute; @contextprivate httpservletrequest запрос @contextprivate servletcontext vecement asception* asception* askerne* ascleurn* atemnling* @Rethurn* @Return* @ @Return. toresponse (Exception Exception) {string message = exceptionCode.internal_server_error; StatusCode = status.Internal_server_error; webApplicationContext context = (webApplicationContext) servletContext.getAttribut basexception.getCode (); object [] args = baseexception.getValues (); message = context.getMessage (code, args, exception.getmessage (), request.getlocale ());} else else (exception encesscement notfoundexception) {message exceptioncode.request_not_found; Исключения записываются в log logger.error (сообщение, исключение); return response.ok (сообщение, mediaType.text_plain) .status (StatusCode) .build ();}}В этом классе мы обрабатываем неконтролируемое исключение, которое мы определили, а также обрабатываем неизвестные исключения системы (включая неизвестные неконтролируемые исключения и проверенные исключения). Наш метод обработки: Запишите журнал исключений; беременный Отправьте стандартный http стандартный код состояния ошибки и сообщение об ошибке клиенту, и клиент сам по себе обрабатывает информацию об ошибке. Стоит отметить, что этот метод обработки поддерживается REST, и он соответствующим образом использует стандартный код состояния HTTP;
В этом классе мы также используем международную конфигурационную компонент Spring для интернационализации ключа ошибки, брошенной системой, которая способствует обновлению интернационализации нашего проекта.
6. Пользовательский базовый класс исключений: baseexception.java
пакет com.iteye.redhacker.jersey.exception;/*** Базовый класс исключений, исключения времени выполнения каждого модуля унаследованы от этого класса*/public class baseexception расширяет runtimeexception {/*** serialversionuid*/private static final long long orialversionuid = 13813254798960570766; / ** * КЛЮЧЕСКИЙ КЛЮЧ */ Private String Code; / ** * Сообщение Params */ private Object [] values; / ** * @return the Code */ public String getCode () {return Code; } / **! } / *** @return the values* / public object [] getValues () {return values; } / ** * @param Значения значений для установки * / public void setValues (object [] values) {this.values = values; } public baseexception (строковое сообщение, бросаемая причина, строковый код, объект [] values) {super (сообщение, причина); this.code = code; this.values = values; }}Этот класс определяет основной шаблон класса исключений проекта, и другие исключения наследуют от него. Стоит отметить, что он умно использует некоторые функции международной конфигурации и даже может добавить сообщение об ошибке, определенное ниже, и повторно использовать сообщение об ошибке, передавая параметры:
{0} {1} ошибка параметров
7. Другие исключения в основном одинаковы, но типы разные. Давайте посмотрим на daoexception.java
пакет com.iteye.redhacker.jersey.exception; открытый класс daoexception extends baseexception {/** * конструкторы * * @param code * код ошибки */public daoexception (строковый код) {super (код, null, код, null);}/** Constructors * * @param code * interface * @param код. {super (code, code, code, null);}/** * Конструкторы * * * @param code * код ошибки * @param значения * Набор информации об исключении, ожидающие параметры */public daoexception (строковый код, объект [] значения) {super (код, null, код, значения);}/** * * * * Параметры */public daoexception (бросаемая причина, строковый код, объект [] values) {super (код, null, код, значения);} частная статическая конечная длинная длинная серийная ряд = -3711290613973933714l;}Это наследует базис. Когда это исключение будет выброшено, мы напрямую делаем предварительные суждения из имени исключения, и ошибка исходит от слоя DAO.
8. errmsg.properties используется для определения информации об исключении. Давайте посмотрим:
read.file.failed = read file не удалось read.config.failed = read intempt offect overse.be.less.than.10 = Параметр должен быть менее чем за 10colse.file.failed = fore File Fail.
Iii. Развертывание и тестирование
Вы можете скачать исходный код в приложении этой статьи. После импорта Eclipse проверьте исходный код.
Развертывание очень простое, просто добавьте свой tomcat/config/server.xml:
<host> ... <context path = "/a" reloadable = "true" docbase = "d:/workspace/test/jerseyexceptionmappertest/web"/> </host>
Просто начните Tomcat!
Сделайте два теста:
1
2
Для первого теста вы также можете увидеть следующую ошибку исключения в журнале:
[2013-08-15 00:25:55] [Ошибка] Параметр должен быть менее чем за 10com.iteye.redhacker.jersey.exception.serviceexception: upt.be.less.than.10at com.iteye.redhacker.jersey.service.testservice.sayhello (testservice.jave.20) com.iteye.redhacker.jersey.delegate.testresources.sayhello (testresources.java:21) по адресу sun.reflect.nativemethodaccessorimpl.invoke0 (родной метод) на sun.reflect.nativemethodaccessormpl.invoke (nativemethodaccesscesscspormplecplec. sun.reflect.delegatingmethodaccsorsimpl.invoke (DelegatingMethodaccessorImpl.java:25) на java.lang.reflect.method.invoke (метод. Java:597) com.sun.jersey.spi.container.javamethodinvokerfactory $ 1.invoke (javamethodinvokerfactory.java:60) по адресу com.sun.jersey.spi.container.javamethodinvokerfactory $ 1.invoke (Javamethodinvfortory.java com.sun.jersey.server.impl.model.method.dispatch.abstractresourcemethoddispatchprovider $ typeoutinvoker._dispatch (Abstractresourcemethoddispatchprovider.java:185) в com.sun.jersey.server.impl.model.method.dispatch.resourcejavamethoddispatcher.dispatch (resourcejavamethoddispatcher.java:75) на com.sun.jersey.server.impl.uri.rules.httpmethodrule.accep com.sun.jersey.server.impl.uri.rules.righthandpathrule.accept (righthandpathrule.java:147) на com.sun.jersey.server.impl.uri.rules.rootresourcecclassrule.accep com.sun.jersey.server.impl.application.webapplicationImpl._handleRequest (webApplicationImpl.java:1483) на com.sun.jersey.server.impl.application.webapplicationImpl._handlerequest (webapplicationImpl.java:1414) com.sun.jersey.server.impl.application.webapplicationImpl.handleRequest (webApplicationImpl.java:1363) на com.sun.jersey.server.impl.application.webapplicationImpl.HANDLEREQUEST (webApplicationImpl.java:1353)
Для других тестов вы можете попробовать, например, намеренно удаление теста. Прозрачные. Когда файл, который нужно прочитать, не может быть найден, как проверяемое исключение преобразуется в самоопределенное неверное исключение и регистрирует его, возвращая стандартный код состояния ошибки и ошибку HTTP и информацию об ошибках клиенту.
4. Резюме
1. Не сложно увидеть в рамках Джерси, что в разработке веб -проектов мы обработали проверенное исключение и неконтролируемое исключение как можно более равномерно на уровне фреймворта, чтобы мы могли уделять больше внимания реализации бизнеса.
2. Если это не Web Project, я думаю, что дизайнер архитектуры программы также должен также попытаться обработать исключения равномерно; Если он не обрабатывается равномерно, когда встречается проверенное исключение, мы должны обрабатывать с ним соответствующим образом, вместо того, чтобы просто делать e.printstacktrace (); Если мы не сможем восстановить исключение, мы должны хотя бы полностью записать информацию об ошибке исключения в файле журнала, чтобы ошибки были проверены, когда последующие программы не будут выполнены.
Полный текст (конец)