2009-11-24 7 views
5

Durante la ejecución normal del programa, puede producirse una excepción.Cómo ignoro las excepciones en F #

En caso de que sea consciente de ello y solo quiera ignorarlo, ¿cómo logro esto en F #?

Aquí está mi código, que compila con una advertencia:

let sha = new SHA1CryptoServiceProvider() 
let maxLength = 10000 
let fileSign file = 
    let fs = File.OpenRead(file) 
    let mutable res = (0L, [|0uy|]) 
    try 
     let flLen = fs.Length 
     let len = int (min (int64 maxLength) flLen) 

     // read 'len' bytes   
     let mutable pos = 0 
     while (pos < len) do 
      let chunk = fs.Read(buf, pos, len - pos) 
      pos <- pos + chunk 

     // get signature    
     let sign = sha.ComputeHash(buf, 0, len) 

     // store new result 
     res <- (flLen, sign)   
    with 
     | :? IOException as e -> e |> ignore 
    finally 
     if (fs <> null) then 
      fs.Dispose() 
    res 

La advertencia es:
error FS0010: Unexpected keyword 'finally' in binding. Expected incomplete structured construct at or before this point or other token.

El correspondiente equivalente C# para lo que quiero decir:

FileStream fs = null; 
try 
{ 
    fs = File.OpenRead(file); 
    // ... other stuff 
} 
catch 
{ 
    // I just do not specify anything 
} 
finally 
{ 
    if (fs != null) 
     fs.Dispose() 
} 

Si simplemente omito el bloque with en F #, la excepción no se ignora.

Respuesta

8

try-con y tratan-finalmente son construcciones separadas en F #, por lo que necesita un 'intento' extra para que coincida con el último:

try 
    try 
     ... 
    with e -> ... 
finally 
    ... 

Como Vitaliy señala, es más idiomático utilizar 'uso' para finallys-que-disponer

use x = some-IDisposable-expr 
... 

Ver también

Documentos sobre 'uso': http://msdn.microsoft.com/en-us/library/dd233240(VS.100).aspx

Especificaciones para 'uso': http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc245030850

5

try..with..finally no es compatible con F #. Así como en OCaml. Debe usar use la declaración aquí:

try 
    use fs = ... 
with.... 
Cuestiones relacionadas