Недавно у меня была дискуссия с моим коллегой, об использовании try
and catch
чтобы уведомить об ошибках или избежать их.
Это мой подход к коллеге:
import Config from 'config';
export const getUserFromLocalStorage = () => {
const key = Object.keys(localStorage).find(value => value === '${Config.applicationId}/currentUser');
try {
return key ? JSON.parse(localStorage[key]) : {};
} catch (e) {
return {};
}
};
Это означает, что он не заботится об данной ошибке, и он просто переносит возвращающий объект, чтобы продолжить процесс
и мой:
import Config from 'config';
export const getUserFromLocalStorage = () => {
const key = Object.keys(localStorage).find(value => value === '${Config.applicationId}/currentUser');
try {
return key ? JSON.parse(localStorage[key]) : {};
} catch (e) {
console.log('the given error', e); // Just simple notifier for this example
}
};
но мой подход по-прежнему имеет проблему, которая заключается в том, что он вернет undefined
(что может привести к сбою внутри моего приложения), что может легко исправить его, используя, finally
и вернуть значение по умолчанию, но это не кажется мне хорошей практикой.
Итак, что будет использовать баланс, используя try
catch
и, finally
при необходимости, чтобы сделать мое приложение стабильным.
Что-то не так с нашим подходом?
В частности, мы не можем доверять данным, которые localStorage
из localStorage
, и каков будет наилучший подход для этой реализации?
Поскольку, finally
, выполняется в любом случае, было ли что-то брошено или нет, это не то место, где нужно вернуть значение по умолчанию. Также сомнительно, нужно ли регистрировать ошибку в деталях или нет. Все зависит от того, является ли что-то ожидаемой ошибкой или поистине исключительным обстоятельством, и кто может что-то с этим сделать.
Возможно ли, что сохраненное значение недействительно JSON? И у вас есть "план резервного копирования" для того, что делать в этом случае? И нет ничего, что может сделать пользователь и/или разработчик? Тогда никого не беспокоить. Возможно, вы хотите console.log
сообщение, которое может помочь в отладке, но кроме этого просто продолжайте с потоком программы. Там, безусловно, не нужно беспокоить пользователя alert
если: а) пользователь не инициировал действие и б) им тоже ничего не нужно делать.
Соображения:
Независимо от того, чтобы catch
ошибку в первую очередь:
Записывать ли ошибку:
Что-то об ошибке:
Возвращать пустой объект или ничего /null
/undefined
зависит от того, что такое функция. Является ли функция, определенная для того, чтобы всегда возвращать объект? Затем он должен return {}
из catch
. Или "ничего" действительный ответ, когда ожидаемого объекта не существует? Тогда, возможно, return false
.
В целом, подход моего коллеги кажется мне очень разумным.
localStorage
есть недопустимый объект JSON, и я localStorage
пустой объект, предполагая, что getUserFromLocalStorage
всегда будет работать и возвращать что-то (действительное), что является «неправильным»? Так как произошла ошибка, я понимаю ваше объяснение. На самом деле, мы не должны даже возвращать пустой объект, если ключ не существует. Я предполагаю, что все зависит от того, что контракт для функции getUserFromLocalStorage
. что ты думаешь? :)
В этом конкретном случае, когда вы работаете с localStorage
(что почти всегда неизбежно означает работу с JSON.parse()), всегда рекомендуется перевернуть обработку в try-catch. Это связано с тем, что как localStorage, так и JSON.parse имеют исключения как нормальную часть обработки ошибок, и, как правило, можно с легкостью вернуться к умолчанию или первоначальному значению.
Образец, который я использую, выглядит следующим образом:
const DEFAULT_VALUE = {};
try {
const result = JSON.parse(result);
return result || DEFAULT_VALUE;
} catch (e) {
console.warn('Error parsing result', e);
}
return DEFAULT_VALUE;
Таким образом, у вас есть последовательная обработка ошибок и возврат значения по умолчанию.
В общем, вам не нужно использовать try-catch, если вы не можете и будете безопасно обрабатывать ошибку и генерировать полезную резервную копию. По этой причине большинство блоков try-catch имеют тенденцию сидеть у основания стека вызовов, так что они улавливают незапланированные ошибки, обрабатывают их изящно для пользователя, но записывают их шумно с помощью стека вызовов на консоль для разработчика правильно исследовать/обрабатывать/работать.
Я думаю, что самое главное - это удовлетворение пользователей. В конце дня программа используется обычным пользователем. Пользователь должен продолжить свою работу, используя программу без каких-либо перерывов.
Поэтому я считаю, что наилучшей практикой является использование try
для запуска кода и catch
если есть какие-либо ошибки, и уведомлять разработчика и/или пользователя о наличии исключения и использовать, finally
для преодоления исключения путем возвращения действительного объекта.
Таким образом, пользователь также может продолжить работу, и разработчик также может проверить ошибку в файле журнала для будущей отладки. Это моя личная идея.
is that it will return undefined (which can crash internaly my app)
: вы должны документально подтвердить, что метод может вернутьundefined
и ваш код, вызывающий его, должен быть в состоянии это обработать. Точно так же пустой объект вашего коллеги может вызвать исключение для вызова кода. Главное - документировать то, что возвращается в состоянии ошибки, и позволить вашим абонентам решать, что делать.finally
вернуть значение по умолчанию для случая ошибки.