Menu
Coddy logo textTech

error Arayüzü

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 52 / 107.

Go'da hatalar, error adlı yerleşik bir arayüz aracılığıyla işlenir. Bu arayüz son derece basittir. Yalnızca bir yöntem gerektirir:

type error interface {
    Error() string
}

Bir Error() yöntemi uygulayan ve bir dize döndüren herhangi bir tür, error arayüzünü otomatik olarak karşılar. Bu, Go'nun arayüz sisteminin işleyişidir: açık bir bildirim gerekmez.

Hata oluşturmanın en yaygın yolu errors paketini kullanmaktır:

import "errors"

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("cannot divide by zero")
    }
    return a / b, nil
}

Go işlevleri genellikle son dönüş değeri olarak bir hata döndürür. Hata oluşmadığında nil döndürürsün. Ardından çağıran, devam etmeden önce hatanın nil olmayan bir değer olup olmadığını kontrol eder:

result, err := Divide(10, 0)
if err != nil {
    fmt.Println("Error:", err.Error())
    return
}
fmt.Println("Result:", result)

Biçimlendirilmiş hata mesajları oluşturmak için fmt.Errorf işlevini de kullanabilirsiniz:

func GetUser(id int) (string, error) {
    if id <= 0 {
        return "", fmt.Errorf("invalid user id: %d", id)
    }
    return "Alice", nil
}

İstisnalar fırlatmak yerine hataları döndürme yaklaşımı Go için temeldir. Hata işlemeyi açık hâle getirir ve işler ters gittiğinde ne olduğunu düşünmeye zorlar: sağlam, nesne yönelimli kod yazmanın temel bir unsuru.

challenge icon

Görev

Kolay

Go'nun hata işleme modelini gösteren bir banka hesabı sistemi oluşturalım. İşlemleri doğrulayan ve işler ters gittiğinde anlamlı hatalar döndüren basit bir hesap oluşturacaksın.

Kodunu iki dosyada düzenleyeceksin:

  • account.go: Dışa aktarılan bir BankAccount alanına (string) ve dışa aktarılmayan bir Owner alanına (float64) sahip bir balance struct'ı oluştur. Aşağıdakileri uygula:
    • NewBankAccount(owner string, initialDeposit float64) (*BankAccount, error) - ilk para yatırma miktarı sıfır veya negatifse "initial deposit must be positive" mesajıyla bir hata döndüren kurucu. Aksi takdirde hesabı oluştur ve döndür.
    • Deposit(amount float64) error - bakiyeye para ekler. Miktar sıfır veya negatifse "deposit amount must be positive" mesajıyla bir hata döndür.
    • Withdraw(amount float64) error - bakiyeden para çıkarır. Miktar sıfır veya negatifse "withdrawal amount must be positive" mesajıyla veya bakiye çekilecek miktardan azsa "insufficient funds" mesajıyla bir hata döndür.
    • Balance() float64 - mevcut bakiyeyi döndürür
  • main.go: Hesap bilgilerini ve işlem miktarlarını girdiden oku. Bir hesap oluşturmaya ve işlemleri gerçekleştirmeye çalış. Her işlemden sonra başarı mesajını veya hata mesajını yazdır.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Hesap sahibi adı
  • 2. satır: İlk para yatırma miktarı
  • 3. satır: Para yatırma miktarı
  • 4. satır: Para çekme miktarı

Her işlem için sonucu yazdır:

  • Hesap oluşturulduktan sonra: Account created for [Owner] with balance: $[balance] veya Error: [error message]
  • Para yatırıldıktan sonra: Deposited successfully. New balance: $[balance] veya Error: [error message]
  • Para çekildikten sonra: Withdrew successfully. New balance: $[balance] veya Error: [error message]

Tüm bakiye değerlerini iki ondalık basamakla biçimlendir. Hesap oluşturma başarısız olursa kalan işlemleri atla.

Örneğin, Alice, 100, 50 ve 200 verildiğinde çıktın şu şekilde olmalıdır:

Account created for Alice with balance: $100.00
Deposited successfully. New balance: $150.00
Error: insufficient funds

Bob, -50, 25 ve 10 verildiğinde ise çıktın şu şekilde olmalıdır:

Error: initial deposit must be positive

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Sahip adını oku
	ownerName, _ := reader.ReadString('\n')
	ownerName = strings.TrimSpace(ownerName)

	// Read initial deposit
	initialDepositStr, _ := reader.ReadString('\n')
	initialDeposit, _ := strconv.ParseFloat(strings.TrimSpace(initialDepositStr), 64)

	// Read deposit amount
	depositStr, _ := reader.ReadString('\n')
	depositAmount, _ := strconv.ParseFloat(strings.TrimSpace(depositStr), 64)

	// Read withdrawal amount
	withdrawStr, _ := reader.ReadString('\n')
	withdrawAmount, _ := strconv.ParseFloat(strings.TrimSpace(withdrawStr), 64)

	// TODO: NewBankAccount kullanarak yeni bir banka hesabı oluştur
	// Hata varsa, "Error: [error message]" yazdır ve return et
	// Başarılıysa, "Account created for [Owner] with balance: $[balance]" yazdır

	// TODO: Yatırma tutarını yatırmayı dene
	// Hata varsa, "Error: [error message]" yazdır
	// If successful, print "Deposited successfully. New balance: $[balance]"

	// TODO: Çekme tutarını çekmeyi dene
	// Hata varsa, "Error: [error message]" yazdır
	// If successful, print "Withdrew successfully. New balance: $[balance]"

	// Bakiye değerlerini iki ondalık basamakla fmt.Printf("%.2f", balance) kullanarak biçimlendirmeyi unutma

	_ = ownerName
	_ = initialDeposit
	_ = depositAmount
	_ = withdrawAmount
}
quiz iconKendini test et

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

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi