Menu
CoddyTech

try ile Hataları Yakalama

Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 10 / 27.

Ağ çağrısı başarısız olabilir: telefonun sinyali yoktur, sunucu çalışmıyordur ya da yol yanlıştır. fetch başarısız olduğunda bir hata fırlatır: api.dart dosyasının en üstünde bulunan, statusCode ve message içeren küçük bir sınıf olan ApiException. Kimsenin yakalamadığı bir hata, işlevinizi durdurur ve Console'da kırmızı bir hata olarak görünür; kişi de hiç bitmeyen bir yükleme simgesi görür.

Hatayı try ve catch ile yakalayın:

try {
  final text = await fetch('/message');
  // yalnızca fetch başarılı olduğunda çalışır
} catch (e) {
  // yalnızca fetch bir hata fırlattığında çalışır
  print('It failed: $e');
}

Dart, try bloğunu çalıştırır. Bu bloğun içindeki herhangi bir şey hata fırlatırsa Dart doğrudan catch bloğuna geçer ve hata e içinde tutulur. try bloğunda hatanın oluştuğu satırdan sonraki satırlar hiçbir zaman çalışmaz.

await ifadesini try bloğunun içine koyun: hata fırlatan satır budur. Ardından çökmesine izin vermek yerine, ne olduğunu kişiye sözcüklerle açıklayın.

Ön izlemede hatayı görmek için main işlevinin ilk satırı olarak offline = true; yazıp Run'a basın. offline, api.dart dosyasından gelir: her çağrının, telefonun sinyali yokmuş gibi başarısız olmasını sağlar. Check'e basmadan önce bu satırı kaldırın.

challenge icon

Görev

Orta

loadMessage işlevinin başarısız bir çağrıdan etkilenmemesini sağla:

  • fetch çağrısını ve ardından gelen setState çağrısını bir try bloğuna yerleştir
  • catch (e) içinde dönen yükleme simgesini durdur ve mesajı Could not load: $e olarak ayarla

Kendin dene

import 'package:flutter/material.dart';

import 'api.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: MessageScreen(),
    );
  }
}

class MessageScreen extends StatefulWidget {
  const MessageScreen({super.key});

  @override
  State<MessageScreen> createState() => _MessageScreenState();
}

class _MessageScreenState extends State<MessageScreen> {
  String message = 'No message yet';
  bool loading = false;

  Future<void> loadMessage() async {
    setState(() {
      loading = true;
    });
    final text = await fetch('/message');
    setState(() {
      message = text;
      loading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            loading
                ? const CircularProgressIndicator()
                : Text(message, style: const TextStyle(fontSize: 24)),
            const SizedBox(height: 24),
            ElevatedButton(onPressed: loadMessage, child: const Text('Load message')),
          ],
        ),
      ),
    );
  }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Veri ve Ağ bölümündeki tüm dersler

Kendi başına pratik yap: Online Flutter derleyicisi