在这种情况下,一般异常处理不是那么糟糕吗? [关闭]

2023-12-26

在下面的代码中,我尝试发送一组通知,我想知道通知是否已成功发送(稍后将其放入数据库中,这样就不再发送它)。

我抓到了是不是很糟糕Exception这里?我真的不在乎未发送通知的原因。

private static async Task<List<Tuple<NotificationToSend, bool>>> SendNotificationsAsync(IEnumerable<NotificationToSend> notificationsToSend)
{
    var tuples = new List<Tuple<NotificationToSend, bool>>();

    using (var smtpClient = new SmtpClient())
    {
        foreach (var notification in notificationsToSend)
        {
            bool sentSuccessfully;

            try
            {
                var mailMessage = new MailMessage
                {
                    Subject = notification.Subject,
                    Body = $"{notification.Text} <br /> This notification was sent automatically",
                    IsBodyHtml = true
                };

                mailMessage.To.Add(notification.ToEmail);

                await smtpClient.SendMailAsync(mailMessage);
                sentSuccessfully = true;
            }
            catch (Exception e)
            {
                sentSuccessfully = false;
                // Here I also plan to log the exception
            }

            var tuple = new Tuple<NotificationToSend, bool>(notification, sentSuccessfully);
            tuples.Add(tuple);
        }
    }

    return tuples;
}

你永远不应该使用catch(Exception e),您应该只捕获您知道可以抛出的异常。并使用 SmtpClientMSDN 文档 https://learn.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.sendasync?view=netframework-4.8表示可以抛出以下四种异常之一:

  • 参数空异常 https://learn.microsoft.com/en-us/dotnet/api/system.argumentnullexception?view=netframework-4.8
  • 无效操作异常 https://learn.microsoft.com/en-us/dotnet/api/system.invalidoperationexception?view=netframework-4.8
  • 对象处置异常 https://learn.microsoft.com/en-us/dotnet/api/system.objectdisposedexception?view=netframework-4.8
  • SMTP异常 https://learn.microsoft.com/en-us/dotnet/api/system.net.mail.smtpexception?view=netframework-4.8

所以你应该这样做:

var sentSuccessfully = false;

var mailMessage = new MailMessage
{
    Subject = notification.Subject,
    Body = $"{notification.Text} <br /> This notification was sent automatically",
    IsBodyHtml = true
};

MailMessage.To.Add(notification.ToEmail);

try
{
    await smtpClient.SendMailAsync(mailMessage);
    sentSuccessfully = true;
}
catch (ArgumentNullException e)
{
    sentSuccessfully = false;
    // Handle Argument Exception
}
catch (InvalidOperationException e)
{
    sentSuccessfully = false;
    // Handle InvalidOperation Exception
}
catch (ObjectDisposedException e)
{
    // This one shouldn't happen, so you could leave it out
    sentSuccessfully = false;
    // Do Handle ObjectDisposed Exception
}
catch (SmtpException e)
{
    sentSuccessfully = false;
    // Handle Smtp Exception
}

这样做的原因是更好的日志记录,如果您知道引发的异常,日志可能会显示类似“引发了 ArgumentNullException,*插入可能的原因解释*”之类的内容

或者,如果您想以相同的方式处理所有异常:

try
{
    await smtpClient.SendMailAsync(mailMessage);
    sentSuccessfully = true;
}
catch (Exception e) when (e is ArgumentNullException || 
    e is InvalidOperationException || 
    e is ObjectDisposedException || 
    e is SmtpException)
{
    sentSuccessfully = false;
    // Handle exception
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在这种情况下,一般异常处理不是那么糟糕吗? [关闭] 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 使用 XMLELEMENT Oracle 时如何替换 ' 或任何特殊字符

    我有以下查询 如何保留撇号 完好无损并且没有将其替换为 apos我也想处理其他角色 SELECT RTRIM XMLAGG XMLELEMENT E I m EXTRACT text FROM dual Output I apos m Th
  • 从 PHP 中的 CIDR 表示法获取列表 IP

    有没有办法 或函数 类 从 CIDR 表示法获取 IP 地址列表 例如 我有 73 35 143 32 27 CIDR 并且想要获取此表示法中的所有 IP 的列表 有什么建议么 谢谢 我将编辑前述 https stackoverflow c
  • 在触摸 MapView 之前视图不会更新

    我有一个主要由一个大地图视图组成的活动 在该 MapView 之上 我还有一些其他视图正在尝试以编程方式与之交互 当我尝试使用 AnimationListener 对 MapView 顶部的其中一个视图进行动画处理时 出现了第一个问题 在我
  • 远程发起人停止被调用

    我有一个应用程序 它在单个进程中创建多个应用程序域 并通过远程处理在它们之间进行通信 我为所有对象创建赞助商以防止它们被垃圾回收 但是 无论如何 有些人最终还是获得了GCed 经过一番调查后 我确定取决于InitialLeaseTime在我
  • 使用 Moment 的guess() 返回时区名称

    我想用时刻的guess 函数 https momentjs com timezone docs using timezones guessing user timezone 返回时区大陆 或国家 和城市 如示例所示 moment tz gu
  • Spring JPA 中跨两个不同数据库表的查询

    我有三张桌子 表1在DB1中 表2和表3都在DB2中 如下所述 DB1中的表1 customerId accountNumber DB2 中的表 2 customerId accountNumber id DB2 中的表 3 id 名称 国
  • 区分音乐文件中的乐器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个音乐文件 是否可以分离出正在演奏的每种乐器 IE 假设我有一些Song mp3 那首歌中有人声 吉他 贝斯和鼓 我想要 4 个
  • 确定 Javascript 对象是“复杂”对象还是只是一个字符串

    我希望能够传递字符串文字 this is a string 或 JavaScript 对象 one this two is three a four string 作为函数的参数 并根据它是字符串还是对象采取不同的操作 我如何确定哪个是真的
  • LINQ to SQL 使用不同的行对多个列进行分组

    我有以下表结构 我想选择不同的CustomerId and CustomerName TotalCost 这是表结构和列数据类型 LogId int CustomerId string CustomerName string Cost in
  • SVG 线端点独立动画

    我正在尝试对 SVG 线端点之一进行动画处理 使其沿着特定路径移动 而另一个端点保持静止 因此线会拉伸和收缩 同时保持笔直 到目前为止 我所实现的目标是使我的整条线沿着路径移动 并将端点之一绑定到它
  • Android 问答游戏 - 每个问题的倒计时器

    我使用此处的教程创建了一个适用于 Android 的测验应用程序 http automateddeveloper blogspot co uk 2011 06 getting started complete android app htm
  • 如何停止 html 属性中 onclick 事件的事件传播?

    我有一个带有 onclick 属性的 html 元素 我需要防止该事件冒泡 我尝试这样做 div 和这个 div 但两者都不起作用 我绝对需要在 html onclick 属性中执行此操作 因为此 div 是 Razor 部分视图的一部分
  • 如何在 Mac 10.7 上的 virtualenv 中安装 MatPlotLib

    这是我尝试做的 SAASSenv miki725mac SAASSenv miki725 python Python 2 7 2 v2 7 2 8527427914a2 Jun 11 2011 15 22 34 GCC 4 2 1 Appl
  • c 编程难题

    给定一个所有元素均为正数的数组 求子序列的最大和 约束条件是序列中的 2 个数字不应在数组中相邻 因此 3 2 7 10 应返回 13 3 和 10 之和 或 3 2 5 10 7 应返回 15 3 5 和 7 之和 我尝试使用所有可能允许
  • NPM 搜索:内存不足

    在 ubuntu 14 10 3 13 0 76 generic 120 Ubuntu SMP Mon Jan 18 15 59 10 UTC 2016 x86 64 x86 64 x86 64 GNU Linux 上 当我这样做时 sud
  • 实现 AsyncTask 的技巧

    大家好 我有一个应用程序 可以在位图上放置一个圆圈 并使用滑动条更改圆圈内像素的 RGB 值 我想使用 asynctask 来加速更改像素的过程 我不知道从哪里开始 我在活动文件底部注释掉了一些代码 因为这是我第一次尝试 谁能指出我如何实现
  • 使用 OpenCV 进行头部(和肩部)检测

    如果我问了一个太新手的问题 请提前道歉 我是 OpenCV 的初学者 我已经完成了一些教程 但我还没有很好地掌握它的概念 问题 如何使用 OpenCV 进行头部检测 不是面部检测 例如在公共汽车或房间内的照片中 注意 我不想做人脸检测 只需
  • 如何使用 firestore 的安全规则验证数组值?

    我有一个创建以下 JSON 结构的表单 reviewed false title Just a title user UYV9TRKXfNW1NeCyFyfjZfagJ8B items age 33 experience Newcomer
  • 在 Laravel Blade 中检索外部 api 的数据

    public function RetrieveStatus response Http get https exemple exemple com fr api
  • 在这种情况下,一般异常处理不是那么糟糕吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在下面的代码中 我尝试发送一组通知 我想知道通知是否已成功发送 稍后将其放入数据库中 这样就不再发送它 我抓到了是不是很糟糕Exception这