Обработка ошибок в асинхронном коде
Реализуйте надежные стратегии обработки ошибок для асинхронных операций, чтобы приложение корректно справлялось со сбоями сети и исключениями.
«Обработка ошибок в асинхронном коде» — бесплатный урок Flutter Mobile Development на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Flutter Mobile Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Flutter Mobile Development содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Handling Unpredictable Async Errors
Asynchronous operations, like fetching data from the internet or reading files, are inherently unpredictable. They might succeed, fail, or even time out.
Robust error handling is crucial to prevent your app from crashing and to provide a smooth user experience. It allows you to gracefully manage these failures.
`try-catch` for Async Operations
The familiar try-catch block in Dart is your primary tool for handling exceptions in asynchronous code. When an await expression throws an error, it can be caught by an enclosing try-catch block.
try: Contains the code that might throw an exception.catch: Catches and handles the exception if one occurs.on: (Optional) Catches specific types of exceptions.
Catching a Simulated Error
Let's see try-catch in action. This example simulates a network error by throwing an Exception within an async function. Notice how catch handles it.
import 'dart:async';
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 1));
// Simulate a network error
throw Exception("Failed to fetch data!");
return "Data received"; // This line won't be reached
}
void main() async {
print("Starting data fetch...");
try {
String data = await fetchData();
print("Success: $data");
} catch (e) {
print("Error caught: $e");
} finally {
print("Fetch attempt complete.");
}
}Handling Specific Exception Types
Sometimes, you want to handle different types of errors in different ways. The on keyword allows you to catch specific exception types, making your error handling more precise.
For example, you might handle a SocketException (network issue) differently from a generic Exception.
Targeted Error Handling
Here, we define two types of errors: a custom NetworkException and a generic Exception. The on clause lets us provide specific handling for each.
import 'dart:async';
class NetworkException implements Exception {
final String message;
NetworkException(this.message);
@override
String toString() => 'NetworkException: $message';
}
Future<void> performNetworkCall(bool shouldFailNetwork) async {
await Future.delayed(Duration(milliseconds: 500));
if (shouldFailNetwork) {
throw NetworkException("No internet connection!");
} else {
throw Exception("An unknown error occurred.");
}
}
void main() async {
print("Attempt 1: Simulate network failure");
try {
await performNetworkCall(true);
} on NetworkException catch (e) {
print("Caught specific network error: ${e.message}");
} catch (e) {
print("Caught generic error: $e");
}
print("\nAttempt 2: Simulate unknown error");
try {
await performNetworkCall(false);
} on NetworkException catch (e) {
print("Caught specific network error: ${e.message}");
} catch (e) {
print("Caught generic error: $e");
}
}Ensuring Cleanup with `finally`
The finally block is an optional part of a try-catch statement. Code inside this block will always execute, regardless of whether an exception was thrown or caught.
It's perfect for cleanup operations, like closing a file stream or dismissing a loading indicator, ensuring resources are properly managed.
Alternative: `Future.catchError`
While try-catch works well with async/await, you can also handle errors directly on a Future object using its .catchError() method. This is often used when chaining Futures or when not using await immediately.
It takes a function that will be called if the Future completes with an error.
Handling Errors with `catchError`
Here's how .catchError() can be used. Notice that the error is handled as part of the Future's completion chain, without needing an async function or await for the error handling itself.
import 'dart:async';
Future<String> getUserData() {
return Future.delayed(Duration(seconds: 1)).then((_) {
throw Exception("User data not found!");
return "User data"; // Unreachable
});
}
void main() {
print("Fetching user data...");
getUserData().then((data) {
print("Success: $data");
}).catchError((error) {
print("Error with .catchError(): $error");
}).whenComplete(() {
print("User data fetch completed.");
});
}Good Practices for Error Handling
Effective error handling makes your app robust and user-friendly:
- Log errors: Use a logging framework to record errors for debugging.
- Provide feedback: Inform the user about what went wrong (e.g., "Network unavailable").
- Retry mechanism: For transient network issues, consider offering a retry option.
- Avoid empty
catchblocks: Always handle or re-throw errors, don't just swallow them.
Async Error Handling Check
Consider the following Dart code snippet. Which statements about its error handling are true?
import 'dart:async';
Future<String> riskyOperation() async {
await Future.delayed(Duration(milliseconds: 100));
if (DateTime.now().second % 2 == 0) {
throw FormatException("Invalid data format!");
}
return "Data processed.";
}
void main() async {
try {
String result = await riskyOperation();
print("Result: $result");
} on FormatException catch (e) {
print("Specific error: ${e.message}");
} catch (e) {
print("Generic error: $e");
} finally {
print("Operation finished.");
}
}Recap: Mastering Async Errors
In this lesson, we explored how to handle errors in asynchronous Dart and Flutter applications. You learned:
- The importance of robust error handling.
- Using
try-catchwithasync/await. - Catching specific exceptions with
on. - Ensuring cleanup with
finally. - An alternative:
Future.catchError(). - Best practices for building resilient apps.
Proper error handling is key to creating stable and user-friendly mobile experiences!
Часто задаваемые вопросы
Урок «Обработка ошибок в асинхронном коде» бесплатный?
Да — полный текст урока «Обработка ошибок в асинхронном коде» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Flutter Mobile Development, подпишись на CoddyKit PRO. Курс Flutter Mobile Development содержит 4 уроков всего.
Чему я научусь в уроке «Обработка ошибок в асинхронном коде»?
Реализуйте надежные стратегии обработки ошибок для асинхронных операций, чтобы приложение корректно справлялось со сбоями сети и исключениями. Ты практикуешь Flutter Mobile Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Flutter Mobile Development?
Предыдущий опыт не требуется. Flutter Mobile Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Обработка ошибок в асинхронном коде»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Flutter Mobile Development?
Да. Каждый урок Flutter Mobile Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Future и async/await
- HTTP-запросы и JSON
- Обработка ошибок в асинхронном коде
- Потоки и реактивные данные