Exception handling 如何在F#中捕获任何异常(System.exception)而不发出警告?
我试图捕获异常,但编译器发出警告:此类型测试或向下转换将始终有效Exception handling 如何在F#中捕获任何异常(System.exception)而不发出警告?,exception-handling,f#,Exception Handling,F#,我试图捕获异常,但编译器发出警告:此类型测试或向下转换将始终有效 let testFail () = try printfn "Ready for failing..." failwith "Fails" with | :? System.ArgumentException -> () | :? System.Exception -> () 问题是:没有警告我怎么做?(我相信一定有办法做到这一点,否则就不会有任何警告)
let testFail () =
try
printfn "Ready for failing..."
failwith "Fails"
with
| :? System.ArgumentException -> ()
| :? System.Exception -> ()
问题是:没有警告我怎么做?(我相信一定有办法做到这一点,否则就不会有任何警告)
像C#
试试看
{
Console.WriteLine(“准备失败…”);
抛出新异常(“失败”);
}
捕获(例外)
{
}
C#
void testFail()
{
尝试
{
Console.WriteLine(“准备失败…”);
抛出新异常(“失败”);
}
捕获(异常)
{
}
抓住
{
}
}
F#等效值:
让测试失败()=
尝试
printfn“准备好失败…”
带“Fails”的Fails
具有
| :? System.ArgumentException->()
| _ -> ()
C#:
void testFail()
{
尝试
{
Console.WriteLine(“准备失败…”);
抛出新异常(“失败”);
}
捕获(参数异常)
{
}
捕获(例外情况除外)
{
}
}
F#等效值:
让测试失败()=
尝试
printfn“准备好失败…”
带“Fails”的Fails
具有
| :? System.ArgumentException作为ex->()
|ex->()
C#:
void testFail()
{
尝试
{
Console.WriteLine(“准备失败…”);
抛出新异常(“失败”);
}
抓住
{
}
}
F#等效值:
让测试失败()=
尝试
printfn“准备好失败…”
带“Fails”的Fails
具有
| _ -> ()
正如Joel所指出的,您不想在C语言中使用
catch(Exception)
,原因与您不使用:?System.Exception->
在F#中。您的C#示例会对任何使用ReSharper或FxCop的人发出警告@乔尔·穆勒,谢谢你的文章。我也不喜欢捕捉一般异常,但有时意外异常可能会混淆用户。谢谢。非常详细。在阅读了乔尔的评论之后,我将尽量避免抓住一般性的例外。但我想有时候失败是有必要的。。。(至少以用户友好的方式给出错误消息)@LLS:捕获基本Exception
类型不一定是问题,而是catch(Exception){}
和catch{}
具有相同的语义,因此前者是冗余的,并产生警告。如果您将异常对象命名为catch(exception ex){},则不会出现任何警告。我不知道您可以像这样为通配符匹配别名。这真的很方便(不仅仅用于异常处理)
真的是多余的,实际上这段代码破坏了
变量|的用途,因为e->(…)
与| e->(…)
模式匹配语句中任何不带guard子句的var都是万能的,命名变量\uu
只是表示您不关心该值。在\uu
上加别名首先会破坏\u
。这应该是公认的答案。目前被接受的答案中的讲座是不必要的,也是没有帮助的。我只想在我的hackathon项目中将2个异常的消息转换为字符串错误的结果
try
.. code ..
with
| _ as e ->