Как Вы прервали бы все Исключения?

Я должен согласиться с вышеупомянутыми плакатами. Если Вы не используете платформу при программировании в PHP, Вы действительно программируете руками, связанными за спиной. Я лично рекомендую CodeIgniter. Это - самая быстрая платформа вокруг, это очень легко изучить и имеет очень активное сообщество. На все Ваши вопросы ответит платформа:

* How your folders are designed

CodeIgniter (или любая платформа в этом отношении) разделяет Вашу логику на представления, модели, и контроллеры, каждого с их собственной папкой.

* Do you have a standard way of dealing with CRUD, pagination, or any other common tasks?

Ки имеет библиотеку разбиения на страницы, и он имеет сторонние библиотеки как DataMapper для обертывания Ваших вызовов CRUD объектно-ориентированным способом (ORM).

* What are ways in which you can make your code more elegant?

разделение модели, представление и контроллер делают для очень изящного кода.

(Эти 2 вопроса я не ответил, в значительной степени подразумеваются при использовании платформы)

5
задан nkr1pt 2 October 2009 в 13:22
поделиться

7 ответов

В Nate and Konamiman ... То, что вы предлагаете, вообще не работает и не отвечает на вопрос OP.

Что если OP запускает новый поток изнутри вашего try / catch?

Например:

public static void main(String[] args) {
    try {
        final Thread t = new Thread( new Runnable() {
            public void run() {
                System.out.println( 3 / Math.min(0,4) );
            }
        } );
        t.start();
    catch(Throwable t) {
        ...
    }
}

Тогда вы не поймаете исключение.

Правильный способ сделать это - использовать Thread.setDefaultUncaughtExceptionHandler.

5
ответ дан 18 December 2019 в 05:55
поделиться

Какова цель вашего перехвата каждого исключения - для ведения журнала, сообщения об ошибках?

Перехват каждого исключения в каждой строке программы Java возможен, но, вероятно, приведет к значительному снижению производительности. Если это неизбежно, вероятно, лучше всего будет использовать что-то вроде AspectJ , которое может работать во время компиляции (то есть «вплетается» в ваши файлы классов) и как таковое намного быстрее, чем динамические прокси.

Но я бы постарался избежать этого любой ценой! В общем, я бы сказал, что лучше ограничить объем исключений, которые вы хотите перехватить. Также вы можете изучить Thread.setDefaultUncaughtExceptionHandler ,

11
ответ дан 18 December 2019 в 05:55
поделиться

Как и в ответе Фила, вот пример кода, показывающий, как использовать обработчик неперехваченных исключений. Это работает как для отмеченных, так и для непроверенных исключений.

Изменить: обновлено для печати трассировки стека на основе обновленных комментариев в вопросе.

import java.lang.Thread.UncaughtExceptionHandler;

public class Test {

    public static void main(String[] args) throws Exception {
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                e.printStackTrace();
            }}

        );

        // throw new RuntimeException(); /* this works too */
        throw new Exception();
    }

}
9
ответ дан 18 December 2019 в 05:55
поделиться

1) Найдите приложение, в вашем файле конфигурации log4j.xml должно быть что-то вроде этого.

    <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="C:/logs/rmDebug.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1500KB"/>
    <param name="MaxBackupIndex" value="2"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="**FOOBAR** %d{dd.MM.yyyy HH:mm:ss} %c  %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="FATAL" />
    </filter>
</appender>

Вы видите значения levelMin и LevelMax? levelMin - это то место, где вы начинаете регистрировать, и levelMax, где вы останавливаетесь, чтобы регистрироваться. (с этим конкретным приложением). У вас может быть несколько аппендеров.

Затем для назначения этого приложения классу или пакету.

3
ответ дан 18 December 2019 в 05:55
поделиться

Более важным, чем просто перехват всех исключений, является то, ГДЕ вы перехватываете исключение:

  1. Не перехватывайте исключение, если вы не можете что-то с этим сделать. Если вы ничего не можете с этим поделать, либо позвольте ему всплыть на следующий уровень, либо поймайте его, заново оберните его как более конкретное исключение и повторно выбросьте.

  2. Всегда имейте глобальный блок обработки исключений (например, в ответе Нейта), чтобы отловить любые ошибки, которые вы нигде не можете обработать, чтобы вы могли изящно потерпеть неудачу.

0
ответ дан 18 December 2019 в 05:55
поделиться

To all those questionning the need to catch all exceptions...

There are a lot of valid reasons to catch all exceptions:

  • someone mentionned displaying a dialog in a GUI app telling about the problem
  • working around bugs in a 3rd party API you really need
  • working around bugs in some JVM implementation
  • self-healing software.
  • automatic online exception reporting.

Note that Java itself does intercept all exceptions on the EDT (Event Dispatch Thread) and spawns a new EDT when the EDT dies. You can consider that a form of "self-healing" software. The EDT dying is not something unheard of and doesn't exactly prevent the applications from running correctly (on the contrary). (and, yup, Swing and AWT have quite some bugs, just take a look at the Sun bug parade ;)

It could be argued that any self-respecting software should actually take into account the case of an unforeseen exception (are all the software you ship 100% bug free and never gets new releases, bug-fix releases?) and do something smart when such unforeseen exception happen.

The 'something smart' may be preventing the software from crashing (like in the EDT case), warning the user, sending a report, etc.

Answers questionning the need to do such a thing or suggesting that doing so is a bad practice should IMHO be modded down.

0
ответ дан 18 December 2019 в 05:55
поделиться

Если вы просто хотите перехватить исключение, будет достаточно блока try / catch. Если вы хотите предотвратить их выбрасывание или выполнить какое-либо протоколирование или обертывание исключения, вам, вероятно, понадобится AOP для этого. AspectJ справится с этим довольно хорошо, но будьте осторожны с потенциальными узкими местами производительности.

Динамические прокси будут работать только тогда, когда метод проксируется, поэтому, если какое-либо исключение генерируется и перехватывается внутри выполнения прокси-объекта, для прокси нет средств для перехвата исключения.

Следует учитывать, перехватываете ли вы все исключения или только отмеченные исключения. Чтобы перехватить все исключения, AspectJ вокруг выброса или после выброса совета будет обрабатывать каждый метод, это включает создание объектов JoinPoint и синтетических методов при каждом вызове метода. Обычно это не проблема, если процесс не находится в замкнутом цикле, когда сборка мусора может зашкаливать.

0
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: