זריקת שגיאה
חלק מהיחידה נתונים ורשת במסלול ה-Flutter של Coddy. שיעור 11 מתוך 27.
שגיאות אינן מיועדות רק לשרתים. הפונקציות שלך יכולות לסרב להמשיך. כשפונקציה מקבלת משהו שהיא לא יכולה לעבוד איתו, היא זורקת שגיאה:
Future<void> saveName(String name) async {
if (name.isEmpty) {
throw Exception('The name cannot be empty');
}
// שמור את השם
}throw עוצר את הפונקציה באותו מקום, כמו return, אבל מחזיר שגיאה במקום ערך. Exception('...') היא השגיאה, עם הודעה שמסבירה מה השתבש.
מי שקרא לפונקציה תופס את השגיאה באמצעות try ו-catch, בדיוק כמו שגיאה מ-fetch. כשהיא מומרת לטקסט, Exception מתחילה ב-Exception: , ואחריו ההודעה שלך.
כך פועלת גם fetch אמיתית. כל תשובה משרת מגיעה עם קוד סטטוס: 200 פירושו תקין, 404 פירושו לא נמצא. כשהקוד אינו 200, הקוד שלך זורק שגיאה, כך שהמסך לעולם לא יציג תשובה פגומה כאילו הייתה נתונים:
final response = await http.get(Uri.parse(url));
if (response.statusCode != 200) {
throw Exception('The server answered ${response.statusCode}');
}
return response.body;אתגר
קלהקש על Save כשהשדה ריק: מוצגת ההודעה Saved: ללא שם. שנה את saveName כך שתדחה שם ריק: לאחר ההמתנה, אם name ריק, יש להפעיל Exception('The name cannot be empty'). הפונקציה save כבר תופסת את החריגה ומציגה את ההודעה.
נסו בעצמכם
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: NameScreen(),
);
}
}
class NameScreen extends StatefulWidget {
const NameScreen({super.key});
@override
State<NameScreen> createState() => _NameScreenState();
}
class _NameScreenState extends State<NameScreen> {
final controller = TextEditingController();
String status = '';
@override
void dispose() {
controller.dispose();
super.dispose();
}
Future<void> saveName(String name) async {
await Future.delayed(const Duration(seconds: 1));
}
Future<void> save() async {
try {
await saveName(controller.text);
setState(() {
status = 'Saved: ${controller.text}';
});
} catch (e) {
setState(() {
status = '$e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: controller,
decoration: const InputDecoration(labelText: 'Name'),
),
const SizedBox(height: 16),
ElevatedButton(onPressed: save, child: const Text('Save')),
const SizedBox(height: 16),
Text(status, style: const TextStyle(fontSize: 18)),
],
),
),
);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה נתונים ורשת
תרגלו בעצמכם: קומפיילר Flutter אונליין