Вопрос

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

Каждый раз, когда я использую try... catch Заявление, в Catch Block я всегда регистрирую сообщение моей внутренней консоли. Однако мои журналы не являются последовательными. Они либо выглядят:

catch(err) {
DFTools.console.log("someMethod caught an error: ",err.message);
...

или:

catch(ex) {
DFTools.console.log("someMethod caught an exception: ",ex.message);
...

Очевидно, что код функционирует правильно в любом случае, но он начинает беспокоить меня, что я иногда называю «ошибки», а иногда и «исключениям». Как я уже сказал, может быть, я расщепляю волосы, но это правильный терминология? «Исключение» или «Ошибка»?

Это было полезно?

Решение

Это немного субъективно, но для меня ошибка, когда кто-то или что-то делает что-то неверное, неправильное или недействительное. Это может быть ошибка синтаксиса, логическая ошибка, ошибка чтения, ошибка пользователя или даже социальная ошибка. Это абстрактная концепция.

Исключение, с другой стороны, является объектом, созданным и брошенным, когда в коде возникает определенное состояние. Это может или не может соответствовать концептуальной ошибке. Итак для меня правильная номенклатура - «исключение».

Другие советы

То Спецификация Ecmascript называет их исключениями. Возможно, вы захотите сделать аналогично.

Чтобы сделать вашу регистрацию более информативным:

catch(ex) {
    DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message);

Вы также можете иметь в виду, что исключения (к сожалению) могут быть любого типа, и поэтому не обязательно иметь name а также message характеристики:

catch(ex) {
    if (ex.message && ex.name) {        
        DFTools.console.log("someMethod caught an exception of type " 
           + ex.name + ": ", ex.message);
    } else /* deal with it somehow */

Как это начинает выглядеть довольно громоздким, чтобы повторить везде, вы можете захотеть охватить его в функции:

function logExceptions(methodName, action) {

    try {

        action();

    } catch (ex) {
        if (ex.message && ex.name) {        
            DFTools.console.log("someMethod caught an exception of type " 
               + ex.name + ": ", ex.message);
        } else {
            DFTools.console.log("someMethod caught a poorly-typed exception: " + ex);
        }
    }
}

Теперь вы можете сказать:

logExceptions(function() {

    // do some risky stuff...

});

В JavaScript это называется ошибками. Поэтому я бы предложил вам использовать ошибку вместо исключения. Оставьте выбор в середине, используя «E». Как в примерах Mozilla.Mozilla Core JavaScript 1.5 Ссылка

Исключение - это то, что вы можете ожидать, например, в попытке открыть файл может столкнуться с «файлом, не найденным исключением». С другой стороны, ошибки - это то, что вы не видите, что он идет как стек над потоком или недостаточно памяти.

Исключение является альтернативным логическим выходом из функции, которая не дает логического результата. Исключение также позволяет лучше объяснить, что случилось, почему это существует таким образом. Для открытия файлов, опять же, дескриптор файлов является логическим результатом, и если файл не существует (одно возможное исключение), либо это папка, а не файл (другое возможное исключение).

Основной отказ от ответственности: Я не считаю, что на это есть «правильный» ответ на это. Виды, выраженные здесь, являются субъективными и личными. Более того, это то, что идеи, которые я собираюсь поддержать, только полезен, только если вы собираетесь делать разные вещи с разными, AHEM, неисправностями ... Как вы можете использовать систему в соответствии с информативным ответом Daniel Earwicker. С этим в мыслях:

Я утверждаю, что «исключение исключительно». Ошибка менее неожиданной.

Отказ от ответственности: Следующий псевдокод не является хорошим; Это просто служит минимальным случаем, который я мог бы подумать, чтобы проиллюстрировать мою точку зрения.

Примечание: В этом мыслительном эксперименте GetFile возвращается undefined, если он не может найти указанный файл.

function AlwaysGetFile(name){
    var file = null;
    if(FileExists(name)){
        file = GetFile(name);
        if(typeof file === "undefined"){
            throw new "couldn't retrieve file" EXCEPTION
        }
    }
    else{
        throw new "file does not exist" ERROR
    }
    return file;
}

В случае, если потребитель вызывает GetFileRTHROW с именем файла, который не существует, произойдет ошибка. На мой взгляд, различие - это действительно тот код более высокого уровня (или пользовательский ввод) делает что-то не так ... эта функция должна передавать ошибку вверх по линии к тому, что код более высокого уровня, который может решить, что делать с этим результатом. Посмотрите, что это так ... эта функция говорится о любых потребляющих функциях:

Смотри, мой друг, я знаю, что здесь происходит: это ошибка, чтобы запросить BOBACCOUNTS.xml, так что не делайте этого снова! О, и если вы думаете, что теперь вы знаете, что, возможно, пошло не так (злоупотреблять меня), иди и попытайтесь восстановить от него!

Теперь рассмотрите дело, что эта функция принимает имя, проверяет, что файл существует, а затем по какой-то причине не выполняется его. Это другая ситуация. Что-то действительно неожиданное. Более того, потребляющий код не виноват. Отказ Теперь мы действительно хотим эту функцию сказать любым потребляющим функциям:

О, Fiddlesticks! Извините за это, я смиренно прошу прощения, но что-то исключительное, что я на самом деле не понимаю, пошло не так. Я не думаю, что ваш запрос на bobaccounts.xml был необоснованным ... и я знаю, что я должен выполнять это для вас. Поскольку я более низкий уровень уровня, чем вы, я действительно должен знать, что происходит ... но я не ... и с тех пор, как у тебя меньше шансов, чем я понимаю эту исключительную ситуацию, я думаю, вы, вероятно, Лучше всего остановить то, что вы делаете, и пусть это сообщение пройдет весь путь к вершине ... Я имею в виду, есть что-то серьезно Рыбное происходит здесь.

Поэтому я полагаю, что мое резюме это: если ошибка произошла в коде более высокого порядка (вы были приняты плохими данными), бросьте ошибку. Если ошибка произошла в нижнем коде заказа (функция, которую вы зависели от не удалось так, чтобы вы не поняли и не могли планировать) бросить исключение ... И если ошибка произошла в функции, которую вы пишете. , Ну, дух, если вы осознаете, что это исправьте!

И, наконец, чтобы ответить на оригинальный вопрос более напрямую: с точки зрения обращения с ошибками и исключениями, мой совет будет: обрабатывать все ошибки, изящно (необязательно введя их) ... но справедливо справляться с исключениями; Только попробуйте восстановить из исключения, если вы действительно уверены, что вы знаете, что это такое и почему это произошло, иначе позвольте ему пузыриться (обрабатывать его, если вам нужно).

То, что вы попадаете в Catch Block, это исключение, поэтому я называю его исключением ...

Если это ошибка - я могу справиться с ним в моем коде, и я обычно не ожидаю, чтобы увидеть его в блоке Catch

Хет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top