警告CA1031修改''以捕获比'Exception'更具体的异常或重新抛出该异常

时间:2018-07-10 07:01:53

标签: .net exception-handling c#-6.0

下面的代码用C#6编写。这是特定的异常处理吗?

@echo off
setlocal EnableDelayedExpansion
set "emailUserName=toolfortablet@gmail.com"
set "emailPassword=Monopolis1"
set "target=toolfortablet@gmail.com"
set "subject=ĄČĘĖĮŠŲŪ("
FOR %%G IN (*) DO attrib -A "%%G"
:loop
set "body="
FOR %%G IN (*) DO (
attrib "%%G" | findstr /B /L A 1>nul
if !errorlevel! equ 0 (
    echo "%%G"
    set "body=!body!^<br ^/^>%%G"
    attrib -A "%%G"
    )
) 2>nul
if not "%body%"=="" echo sending email
if not "%body%"=="" set "body=Buvo ikelta nuotrauka:!body!"
if not "%body%"=="" powershell.exe -command "Send-MailMessage -From 
'!emailUserName!' -to '!target!' -Subject '!subject!' -Body '!body!' - 
BodyAsHtml -SmtpServer 'smtp.gmail.com' -port '587' -UseSsl -Credential (New- 
Object -TypeName System.Management.Automation.PSCredential -ArgumentList 
('!emailUserName!', (ConvertTo-SecureString -String '!emailPassword!' - 
AsPlainText -Force)))"
goto :loop

我的代码以前是

catch (Exception e) when (e is NullReferenceException || e is InvalidOperationException)
{
    //Log exception
}

当时我得到警告

  

警告CA1031修改''以捕获比以下更具体的异常   代码分析时出现“异常”或“抛出异常”。

2 个答案:

答案 0 :(得分:0)

捕获Exception并让您的代码继续存在的一般问题是任何事情。您不再知道程序其余部分处于什么状态。更具体的异常过滤器(就我而言)的问题是,您正在捕获编程错误和再次提醒您,不要让该程序继续运行,因为您显然处于意外地区。

通常,我建议在适当的顶层安装一个未处理的异常处理程序(这取决于您所构建的应用程序框架,但通常不会由实际的{{1 }}块),然后在退出前记录。您在具有异常处理程序的其他任何地方都应该针对具有特定于 恢复策略的特定异常。空引用和无效操作不太可能属于后一种。

答案 1 :(得分:0)

这是具体的。 思路类似于

catch (NullReferenceException e)
{
    //Log exception
}
catch(InvalidOperationException e)
{
    //Log exception
}

这是具体的。

CA1031 仅涵盖 N 个同类案例中的一个。全局的想法是尽可能捕获特定的异常。