SORU
15 Mayıs 2011, Pazar


Özel durum Haskell işleme

Üç Haskell işlevleri kullanımını anlamak için yardıma ihtiyacım var

  • deneyin (Control.Exception.try :: Exception e => IO a -> IO (Either e a))
  • catch (Control.Exception.catch :: Exception e => IO a -> (e -> IO a) -> IO a)
  • kolu (Control.Exception.handle :: Exception e => (e -> IO a) -> IO a -> IO a)

Bazı şeyleri bilmek istiyorum:

  1. Ne zaman hangi işlevi kullanılır?
  2. Nasıl basit bir örnek ile bu fonksiyon kullanabilirim?
  3. Nerede yakalamak arasındaki fark ve idare edilir? Neredeyse farklı bir sipariş ile aynı imza var.

Benim denemeler yazıp bana yardımcı olabilir umuyoruz çalışacağım:

deneyin

Böyle bir örnek var:

x = 5 `div` 0
test = try (print x) :: IO (Either SomeException ())

İki sorum var:

  1. Nasıl özel bir hata çıktı ayarlayabilirim?

  2. Ben İ :: IO (Either SomeException()) yazmak gerekir SomeException tüm hataları ayarlamak için ne yapabilirim

/catch

Bana özel bir hata çıktısı ile kısa bir örnek gösterebilir misiniz?

CEVAP
15 Mayıs 2011, Pazar


Ne zaman hangi işlevi kullanılır?

İşte Kontrolü, gelen öneri.Özel durum belgeleri:

  • Eğer bir özel durum oluşturulur olayı biraz temizlik yapmak istiyorsanız, finally, bracket onException kullanın.
  • Bir özel durum sonra kurtarmak ve başka bir şey yapmak için en iyi seçim try aileden biri kullanmaktır.
  • tabii hangi durumda catch catchJust zaman uyumsuz bir özel durum yavaş yavaş kendime gelmeye başladım.

deneyin :: özel Durum e =>IO ->IO (e)

try çalıştırmak için IO bir aksiyon alır, Either döndürür. Eğer işlem başarılı olursa, sonuç Right yapıcı sarılmış verilir. (Yanlış aksine doğru sanırım). Eylem bir özel durum gönderdibelirtilen türde, Left yapıcı döndü. Eğer bu durum olsaydıdeğiluygun tip, yığın yaymak için devam ediyor. Türü olarak SomeException belirtme olabilir ya da iyi bir fikir olmayabilir, tüm özel durumları yakalar.

Eğer saf bir hesaplama bir istisna yakalamak istiyorsan, evaluate try içinde değerlendirme kuvvet kullanmak zorunda olacak unutmayın.

main = do
    result <- try (evaluate (5 `div` 0)) :: IO (Either SomeException Int)
    case result of
        Left ex  -> putStrLn $ "Caught exception: "    show ex
        Right val -> putStrLn $ "The answer was: "    show val

catch :: özel Durum e =>IO ->(e ->IO a) ->IO

catch try benzer. Önce IO belirtilen eylem çalıştırmayı dener, ama eğer bir özel durum işleyicisi alternatif bir cevap alabilmek için istisna verilir.

main = catch (print $ 5 `div` 0) handler
  where
    handler :: SomeException -> IO ()
    handler ex = putStrLn $ "Caught exception: "    show ex

Ancakönemli bir fark var. catch kullanırken amirin asynchroneous bir istisna (yani throwTo ile başka bir iş parçacığı atılan) tarafından rahatsız edilemez. Asynchroneous bir istisna yükseltmek için çalışır amirin çalışması bitinceye kadar engeller.

import Prelude hiding (catch) yapmak isteyebilirsiniz bu yüzden Başlangıç olarak catch farklı olduğunu unutmayın.

kolu :: özel Durum e =>(e ->IO a) ->IO ->IO

handle sadece ters sırayla değişkenlerle catch. Kullanmak için bir kodunuzu daha okunaklı hale getirir bağlı olan, ya da eğer kısmi uygulama kullanmak istiyorsanız, daha iyi bir uyuyor. Aksi aynıdır.

tryJust, catchJust ve handleJust

try, catch handle yakalayacak unutmayıntümbelirtilen/olayla türü özel durumlar. tryJust ve arkadaşlar, özellikle işlemek için hangi filtreler hangi seçici işlevini belirtmek için izin ver. Örneğin, aritmetik hatalar, 38* *türü vardır. Eğer sadece DivideByZero yakalamak istiyorsanız yapabilirsiniz:

main = do
    result <- tryJust selectDivByZero (evaluate $ 5 `div` 0)
    case result of
        Left what -> putStrLn $ "Division by "    what
        Right val -> putStrLn $ "The answer was: "    show val
  where
    selectDivByZero :: ArithException -> Maybe String
    selectDivByZero DivideByZero = Just "zero"
    selectDivByZero _ = Nothing

Saflık üzerine bir not

Özel durum işleme bu tür sadece saf olmayan kod (IO monad yani) olabilir. Eğer saf kod hataları işlemek gerekiyorsa, değerleri yerine Maybe Either kullanarak (veya başka cebirsel veri türü) dönen içine bakmak gerekir. Bu her zaman nerede ne olduğunu çok daha açık olarak sıklıkla tercih edilir. Control.Monad.Error gibi monadlar bu hata işleme türü daha kolay çalışmasını sağlar.


Ayrıca Bkz:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AverageBroTV

    AverageBroTV

    20 Mart 2013
  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • Crossover

    Crossover

    18 HAZİRAN 2007