Pull to refresh

Comments 12

Т.е. для того, чтобы в NewRelic не было Unhandled Exception вы решили сделать GoodException с вьюхами вместо того, чтобы написать ErrorHandler, в котором указывать, какие ошибки кидать в ньюрелик, а какие — нет?
А для того, чтобы юзеру выводился красивый ответ нужно 2 вещи:
1. Кидать ошибки-наследники UserException
2. Почитать доку по отлову ошибок — www.yiiframework.com/doc-2.0/guide-runtime-handling-errors.html — там как раз есть раздел «Customizing Error Display»
Эта дока про вывод ошибок. Если ошибку не ловить, но аккуратно выводить через ErrorHandler, она так и остается непойманной. Соответственно, можно выбросить «GoodException», если ошибка не критичная. А если с ошибкой надо разбираться, то можно выбросить и не ловить другое исключение — HttpServerException и т.п. ErrorHandler его обработает, но оно будет непойманным.
Я даже специально 2 разных комментария оставил — про «непойпанность», и отдельно — про отображение. Почему ответили-то только на один? :)
Чем вас смущает то, что ошибка «не поймана»? Не нравится, когда в ньюрелике отображается куча 400/404-х? Вот — как раз в ErrorHandler'е есть волшебный метод handleException() внутри которого очень удобно решать — посылать ошибку в ньюрелик, или не нужно.
Мы не решаем, что посылать в ньюрелик, а что — нет.
Все, что мы делаем для ньюрелика — вызываем в index.php
if (extension_loaded('newrelic')) {
	newrelic_set_appname('projectname');
}

А дальше неперехваченные исключения сами попадают в статистику, что нас и смущало
Вы не подумайте, что я это всё из вредности писал — просто у меня у самого проект с Yii2+newrelic под боком — и никаких не отловленных исключений там нет — мы сами всё в ньюрелик репортим, что нам нужно.

Оказывается в агенте от 8 июля внесли соответствующие изменения, добавляющие не отловленные исключения. У нас более старая версия.
Пришёл ответ от техподдержки. Для того, чтобы отключить отлов ошибок — нужно добавить вот такую строку в конфиг php:
newrelic.special.disable_instrumentation = restore_exception_handler,set_exception_handler
Отлов ошибок полезен. Если случился Warning или Notice, то тоже будет не пойманной исключение. Если возникло исключение внутри фреймворка, о котором разработчик не позаботился, то такие события тоже стоит фиксировать в мониторинге. На мой взгляд, наиболее удачный подход — самостоятельно контролировать, что будет ошибкой, а что — нет. При этом все нехорошие события, о которых разработчик не позаботился, автоматически считать ошибками. Это на мой взгляд.
Дык я не спорю, что он полезен. Все не отловленные ошибки попадают в стандартный Yii'шный ErrorHandler, а дальше уже с ними можно делать всё, что угодно: посылать в ньюрелик, не посылать в ньюрелик, нарисовать юзеру красивую страницу, и т.д.

Ваш подход меня пугает как минимум тем, что вы внутри эксепшена меняете состояние системы. Ошибки же вообще ничего не должны менять — иначе может стать ещё хуже.
Меняю состояние в смысле возвращаю 500 ошибку? На мой взгляд это нормально. В стандартном ErrorHandler происходит примерно то-же самое.

public function handleException($exception)
    {
        if ($exception instanceof ExitException) {
            return;
        }

        $this->exception = $exception;

        // disable error capturing to avoid recursive errors while handling exceptions
        $this->unregister();

        // set preventive HTTP status code to 500 in case error handling somehow fails and headers are sent
        // HTTP exceptions will override this value in renderException()
        if (PHP_SAPI !== 'cli') {
            http_response_code(500);
        }
...
Дык разницу-то заметьте — не внутри конструктора Exception'а, а в обработчике ошибок.
На мой взгляд это вполне нормально. Если закралась ошибка в самодельном исключении, то это событие тоже окажется в обработчике ошибок.
Но ваш подход тоже интересен — взять и убрать из мониторинга то, что не хочется там видеть ;) Мы может быть тоже рады были бы так сделать, но у нас так не принято.
Sign up to leave a comment.

Articles