Julia: I/O ve Hata Yakalama – Bölüm 7

Herkese selamlar ve sağlıklı günler! 🙂

Bölüm 7 ile tekrardan bir aradayız. Bu bölümde programlama dilleri açısından önem taşıyan iki mekanizmayı tanıyacağız ve kullanım örneklerini gerçekleştireceğiz.

Dilerseniz yazımıza geçelim. 🙂

Bölümler

Bölüm İçeriği

Aşağıda Julia dersleri Bölüm 7 kapsamındaki başlıklar listelenmiştir.

  • Input/Output
  • Hata Yakalama

1. Input/Output

Oldukça temel bir yapı olan I/O (Giriş/Çıkış) işlemleriyle programımız ve dosyalar üzerinde belirli işlevlerin gerçekleştirilmesini sağlarız. Bu işlemler sayesinde, değişik fonksiyonel birimler arasında iletişim kurabilir, bu arayüzle doğrudan etkileşime geçebilir veya dosyalar üzerinde farklı farklı işlemleri gerçekleştirebiliriz.

Basit bir örneklendirme yapacak olursak; bir veri setimiz var diyelim ve bu veri setini programımıza tanıtıp daha sonrasında üzerinde bir veri bilimi projesi yürütmek istediğimizi varsayalım. Bu durumda veri setinin program tarafından okunmasını sağlamak için I/O işlemlerinden faydalanmamız gerekecektir. Bu ve benzeri sebeplerden temel ama oldukça önemli işlemler olduklarını söyleyebiliriz.

Bu bölüme kadar genellikle başlıca yapılar ve tipler üzerinde durup, program ile gerçekleştirebileceğimiz etkileşimlere değinmemiştik.

Dilerseniz şimdi, kullanıcıdan girdi alma, kullanıcıya çıktı verme gibi temel işlemlerin kullanımlarına bir göz atalım.

Kullanıcıyla Etkileşim

print()

Konsolda bir değişkenin değerini veya metini ekrana bastırmak için print() fonksiyonu kullanılır. Birden fazla print() fonksiyonu, değişken veya metin yazdırmada kullanıldığında değerler aynı satıra yazılır. \n karakterinin kullanımıyla print() fonksiyonu için bu durum ortadan kaldırılabilir.

println()

println() fonksiyonu ise, print() komutu ile aynı işlevi gerçekleştirir ancak bir sonraki çıktıyı bir alt satırda sunar. \n kaçış karakteri kullanılmasına gerek kalmaz.

Değişken Etiketleme

Rastgele bir değer üreten rand() komutunun ürettiği değeri $x kullanımı ile ekrana bastırma.

$x burada değişkeni işaret etmektedir.

@printf()

C-stili @printf kullanımı sayı biçimlendirmesine izin verir, ancak ifadelere otomatik olarak \n kaçış karakterini eklemez.

@printf() ve @sprintf() kullanımı için Julia standart kütüphanesi içinden Printf sınıfı using Printf ile eklenmelidir.

@sprintf()

@printf() çıktısı tarafından üretilen sayıyı katar (string) olarak döndürür.

Temel çıktı işlemleri ve katar işlemleri üzerine daha bir çok örneği buradan keşfedebilirsiniz.

Kullanıcıdan Girdi Alma

Kullanıcı tarafından girdi aşağıdaki input() fonksiyonu ile alınmaktadır.

Dosya Okuma ve Yazma

Julia programlama dilinde dosya okuma ve yazma işlemleri temel olarak aşağıdaki gibi yapılır.

Burada “r” yani read okumayı, “w” yani write yazmayı, “a” yani append eklemeyi sağlayan modalitelerdir.

Dosya işlemlerini, blok sona erdiğinde otomatik olarak kapatmak için bir do bloku kullanılmıştır.

open() fonksiyonu dosyayı açmayı sağlayan standart kütüphane fonksiyonudur.

Yukarıdaki işlemler I/O işlemleri için temel işlemlerdir. I/O işlemleri ve fonksiyonları ile ilgili buradan çok daha farklı kullanımlar keşfedebilirsiniz.

Ekstra: I/O İşlemleri İçin Birkaç Paket

Hata Yakalama

Programlarımızda beklenmeyen durumların, hataların önlenmesi için kullanılan mekanizmalara hata yakalama (exception handling) denilmektedir. Bu gibi durumlarda, istisnai durumlar için bu mekanizmalar denetleme sağlamaktadır. Örneğin bir hata oluşması durumunda; programın sonlandırılması veya programcının bu tür istisnai durumların onarılması için yazdığı kodun çalıştırılması gibi.

Hata yakalama mekanizmaları belirli durumların oluştuğunun belirtilmesiyle çalışırlar. Böylece soruna mekanizmamız içerisindeki kod blogunda müdahale edilebilir. Julia programlama dilindeki, yerleşik (built-in) hata durumları aşağıdakilerdir:

Hata Durumları
ArgumentError
BoundsError
CompositeException
DimensionMismatch
DivideError
DomainError
EOFError
ErrorException
InexactError
InitError
InterruptException
InvalidStateException
KeyError
LoadError
OutOfMemoryError
ReadOnlyMemoryError
RemoteException
MethodError
OverflowError
Meta.ParseError
SystemError
TypeError
UndefRefError
UndefVarError
StringIndexError

try/catch Deyimi

try/catch deyimi, istisnaların test edilmesine ve normalde uygulamanızı bozabilecek şeylerin zarif bir şekilde işlenmesine olanak tanır. Beklenmedik durumların nasıl ele alınacağına karar vermemizi kod blogu içinde yönetmemizi sağlar.

Söz dizim formatı:

Örnek Kullanım:

sqrt() fonksiyonu karekök almaya yaramaktadır.

Yukarıdaki kullanımda sqrt() fonksiyonuna geçersiz bir değer gönderilmiştir. Ve bu duruma yönelik bir hata mesajı bastırma gerekliliği bulunmaktadır.

try bloku içindeki herhangi bir işlemde hata oluşuyorsa catch bloku çalıştırılır. Burada, catch bloguna sunulan argüman hata durumunu sembolize etmektedir.

Buradan da görüldüğü üzere sqrt() fonksiyonu için MethodError durumu oluşmaktadır.

Örnek Kullanım:

Örnek Kullanım:

error() Fonksiyonu

error() fonksiyonu ise, normal denetim akışını kesintiye uğratan bir ErrorException özel durumu oluşturmak için kullanılır.

Örnek Kullanım:

throw() Fonksiyonu

İstisnai durumlar throw() fonksiyonu ile de oluşturulabilirler.

Örneğin, argüman negatifse bir DomainError oluşturmak için yalnızca negatif olmayan sayılar için tanımlanan bir fonksiyon yazılabilir:

Örnek Kullanım:

error() ve throw() Karşılaştırması

error() fonksiyonu, bir hatanın meydana geldiğini göstermek için uygundur, ancak throw() daha temel bir fonksiyon üzerine kurulmuştur: throw ilk olarak başlatılabilir, ancak tipik kullanımlarda error() gerekliliği ortaya çıkmaktadır.

Ekstra olarak ResultTypes.jl paketi ile de, bir değeri veya hatayı tutabilen bir Results türü elde edilebilir. Bu paket, bir istisnai durum oluşturmadan bir değeri veya hatayı sabit bir şekilde döndürmemizi sağlar.

ResultTypes.jl kütüphanesine buradan erişebilrisiniz.

Bir sonraki bölümde görüşmek dileğiyle. 🙂