2012-04-06 32 views
5

tôi đã viết đoạn mã này để đọc một tập tin có thể được nén:Làm thế nào để bắt IOError giải nén?

import Codec.Compression.GZip 
import IO -- using IO.try 

read file = do 
    let f = L.readFile file 
    let c = fmap decompress $ f 

    unzipped <- try c 

    case unzipped of 
    Right b -> return b 
    Left _ -> f 

Nó biên dịch tốt, nhưng có vẻ như đây không phải là cách hợp lệ để xử lý các file nén. Chạy mã trên một tệp nén hoạt động tốt, nhưng một tệp không nén không thành công với một ngoại lệ:

*** Exception: Codec.Compression.Zlib: incorrect header check 

Bất kỳ ý tưởng nào về cách thực hiện điều này có thể?

+0

'IO.try' bị phản đối ... về Control.Exception.try' thì sao? http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Exception.html#v:try –

+2

Thêm vào điểm này, 'IO.try' đặc biệt không bắt ngoại lệ từ mã thuần túy , trong khi 'Control.Exception.try' thực hiện. – dave4420

Trả lời

4

Bạn cần nhập Codec.Compression.Zlib.Internal. Lưu ý, cụ thể là phần có tiêu đề “Low-level API to get explicit error reports”.

Bạn sẽ muốn sử dụng một cái gì đó như thế này (lưu ý chưa được kiểm tra):

import qualified Codec.Compression.Zlib.Internal as Z 
import Control.Arrow (right) 

decompressWithoutExceptions :: L.ByteString -> Either Z.DecompressError L.ByteString 
decompressWithoutExceptions = finalise 
          . Z.foldDecompressStream cons nil err 
          . Z.decompressWithErrors Z.gzipFormat Z.defaultDecompressParams 
    where err errorCode errorString = Left errorCode 
     nil = Right [] 
     cons chunk = right (chunk :) 
     finalise = right L.fromChunks 

(tôi đoán bạn đã nhập Data.ByteString.Lazy đủ điều kiện như L.)

+0

wow ... bạn có thể giải thích những gì đang xảy ra ở đây không? :) – fho

+0

Đừng bận tâm, nó có hoạt động không ?! (Các bit nào bạn không hiểu? 'DecompressWithErrors' và' foldDecompressStream', vv được giải thích (có lẽ không đủ rõ ràng?) Trong tài liệu mà tôi liên kết tới.) – dave4420

+0

Phương thức hoàn thiện này đến từ đâu? Tôi đã không tìm thấy nó thông qua hayoo. – fho

2

Bạn có thể muốn xem spoon, điều này sẽ cho phép bạn nhận được Nothing nếu ngoại lệ bị ném.

Các vấn đề liên quan