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 ->