草庐IT

c# - 空捕获 block

coder 2023-07-09 原文

我有时会遇到这样的情况,如果异常被抛出,我需要捕获它,但从不对它做任何事情。换句话说,可能会发生异常,但是否发生并不重要。

我最近读了一篇关于类似事情的文章:http://c2.com/cgi/wiki?EmptyCatchClause

这个人说说评论如何

// should never occur 

是一种代码味道,不应该出现在代码中。然后他们继续解释评论如何

// don't care if it happens

完全不同,我自己也遇到过这样的情况。例如,在发送电子邮件时,我会做类似这样的事情:

var addressCollection = new MailAddressCollection();
foreach (string address in addresses)
{
    try
    {
        addressCollection.Add(address);
    }
    catch (Exception)
    {
        // Do nothing - if an invalid email occurs continue and try to add the rest
    }
}

现在,您可能认为这样做是个坏主意,因为您想要返回给用户并解释一条或多条消息无法发送给收件人。但是,如果它只是一个 CC 地址呢?这不太重要,即使其中一个地址无效(可能只是拼写错误),您可能仍想发送消息。

那么我使用空 catch block 是否正确,或者是否有我不知道的更好的替代方法?

最佳答案

如果您真的想在某种类型的异常发生时什么也不做,那么使用空 catch block 是完全正确的。您可以通过仅捕获您期望 发生并且您知道可以安全忽略的异常类型来改进您的示例。通过捕获 Exception,您可以隐藏错误并让您更难调试您的程序。

关于异常处理要牢记的一件事:用于表示程序外部错误条件的异常与预期至少有时会发生的异常之间存在很大差异,表示编程错误的异常。第一个示例是一个异常,表明由于连接超时而无法发送电子邮件,或者由于没有磁盘空间而无法保存文件。第二个示例是一个异常,表明您试图将错误类型的参数传递给方法,或者您试图越界访问数组元素。

对于第二个(编程错误),仅仅“吞下”异常将是一个很大的错误。最好的做法通常是记录堆栈跟踪,然后弹出一条错误消息,告诉用户发生了内部错误,他们应该将日志发回给开发人员(即您)。或者在开发过程中,您可能只是让它向控制台打印堆栈跟踪并使程序崩溃。

对于第一个(外部问题),没有关于什么是“正确”的事情的规则。这完全取决于应用程序的细节。如果您想忽略某个条件并继续,那么就这样做吧。

一般情况:

阅读技术书籍和文章是件好事。你可以从中学到很多东西。但请记住,当您阅读时,您会发现很多人的建议,他们说做某事总是是错误的或总是是正确的。这些观点通常与宗教接壤。 从不相信以某种方式做事是绝对“正确的”,因为一本书或一篇文章(或关于 SO 的答案......<咳嗽>)告诉你了。每条规则都有异常(exception),撰写这些文章的人并不知道您的应用程序的详细信息。你做。确保您正在阅读的内容有意义,如果没有,请相信您自己。

关于c# - 空捕获 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715664/

有关c# - 空捕获 block的更多相关文章

  1. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  2. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - 在匿名 block 中产生 - 2

    我没有理解以下行为(另请参阅inthisSOthread):defdef_testputs'def_test.in'yieldifblock_given?puts'def_test.out'enddef_testdoputs'def_testok'endblock_test=procdo|&block|puts'block_test.in'block.callifblockputs'block_test.out'endblock_test.calldoputs'block_test'endproc_test=procdoputs'proc_test.in'yieldifblock_gi

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

  8. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  9. ruby-on-rails - 无法在 Rails 助手中捕获 block 的输出 - 2

    我在使用自定义RailsFormBuilder时遇到了问题,从昨天晚上开始我就发疯了。基本上我想对我的构建器方法之一有一个可选block,以便我可以在我的主要content_tag中显示其他内容。:defform_field(method,&block)content_tag(:div,class:'field')doconcatlabel(method,"Label#{method}")concattext_field(method)capture(&block)ifblock_given?endend当我在我的一个Slim模板中调用该方法时,如下所示:=f.form_field:e

  10. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

随机推荐