异步操作中的错误处理
为异步操作实施可靠的错误处理策略,确保应用能够优雅地处理网络故障和异常。
异步操作中的错误处理 是 CoddyKit 上的免费 Flutter Mobile Development 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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!
常见问题解答
「异步操作中的错误处理」课时是免费的吗?
是的 — 「异步操作中的错误处理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Flutter Mobile Development 课程的其余内容,请升级到 CoddyKit PRO。 Flutter Mobile Development 课程共包含 4 节课。
「异步操作中的错误处理」这节课中我会学到什么?
为异步操作实施可靠的错误处理策略,确保应用能够优雅地处理网络故障和异常。 你通过在浏览器中直接运行的动手代码来练习 Flutter Mobile Development,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Flutter Mobile Development 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Flutter Mobile Development 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「异步操作中的错误处理」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Flutter Mobile Development 课中编写并运行代码吗?
能。每节 Flutter Mobile Development 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Future 与异步等待
- HTTP 请求与 JSON
- 异步操作中的错误处理
- 流与响应式数据