← Назад к вопросам
Какие знаешь способы обработки исключений?
1.8 Middle🔥 161 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Обработка исключений в JavaScript
Обработка исключений - критически важный аспект написания надёжного кода. Существует несколько способов обработки ошибок в JavaScript и React.
1. Try-Catch блоки
Классический способ обработки синхронных ошибок:
try {
const result = JSON.parse(jsonString);
console.log(result);
} catch (error) {
console.error("Ошибка парсинга JSON:", error.message);
} finally {
console.log("Блок выполнен в любом случае");
}
Блок finally выполняется всегда, независимо от наличия ошибки.
2. Async/Await с Try-Catch
Для асинхронного кода используй try-catch с async/await:
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error("Ошибка загрузки:", error);
return null;
}
}
3. Promise.catch()
Для работы с Promise без async/await:
fetch("/api/users")
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => {
console.error("Ошибка:", error);
})
.finally(() => {
console.log("Запрос завершён");
});
4. Error Boundaries (React)
Для обработки ошибок в компонентах используй Error Boundaries:
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null };
}
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
componentDidCatch(error, errorInfo) {
console.error("Ошибка поймана:", error, errorInfo);
}
render() {
if (this.state.hasError) {
return <div>Что-то пошло не так: {this.state.error?.message}</div>;
}
return this.props.children;
}
}
// Использование:
<ErrorBoundary>
<MyComponent />
</ErrorBoundary>
5. Обработка ошибок в HTTP запросах
const apiCall = async (url, options = {}) => {
try {
const response = await fetch(url, options);
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || `HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (error instanceof TypeError) {
console.error("Ошибка сети:", error);
} else {
console.error("Ошибка запроса:", error);
}
throw error;
}
};
6. Создание кастомных ошибок
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
function validateEmail(email) {
if (!email.includes("@")) {
throw new ValidationError("Некорректный email");
}
}
try {
validateEmail("invalid");
} catch (error) {
if (error instanceof ValidationError) {
console.error("Ошибка валидации:", error.message);
}
}
7. Обработка ошибок в хуках React
function useDataFetch(url) {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
if (!response.ok) throw new Error("Ошибка загрузки");
setData(await response.json());
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, error, loading };
}
Лучшие практики
- Не игнорируй ошибки молча
- Логируй ошибки для отладки
- Предоставляй пользователю понятные сообщения об ошибках
- Использование try-catch обходится дороже, чем проверка условий
- Для критических операций используй multiple уровни обработки ошибок