我一直是一个在防止异常情况方面犯错误的人,除非我确定不会有错误,否则从不采取行动。我学会了用 C 语言编程,这是真正做事的唯一方法。
在使用 C# 时,我经常看到更多的响应式编程 - 尝试做一些事情并处理异常。对我来说,这似乎是使用异常作为控制语句。前几次我看到这个我认为它是不好的做法。但在过去的几个月里,我到处都看到了它,只是想知道 - 这是被接受/有效还是只是一种流行病?
更新: 为了澄清一点,我看到的大多数异常处理都是
try
{
//open file
}
catch
{
//message box for file not found
}
甚至更糟
try
{
//open xml
//modify xml (100+ lines of code)
}
catch
{
//message for 'unspecified error'
}
我知道有时异常处理非常好用(例如数据库连接),但我指的是使用异常来代替更“传统”的控制。我问这个是因为我觉得这种编程风格是将异常用作拐杖而不是恢复方法,并且想知道这是否只是我必须学习的 C# 世界中的东西。
最佳答案
和往常一样,答案是“视情况而定”,但我总体上赞同“快速失败”的哲学。
我更喜欢使用 try/finally(没有 catch),除非我实际上可以做一些有用的事情来从特定代码块中的异常中恢复。捕获所有可能的异常是不值得的。一般来说,快速失败比默默失败更可取。
另一方面,如果您知道如何从特定异常中恢复,那么是的,那就去做吧。
假设您有一个文件传输库。如果传输由于超时或网络故障而中断,它可能会抛出异常。这是合理的。如果库只是无声地失败,你会很生气;检查返回码更容易出错,而且不一定更具可读性。但也许您有一个业务规则,要将一堆文件发送到服务器,您应该至少尝试 3 次传输文件,然后才放弃并请求用户干预。在这种情况下,业务逻辑应该处理异常,尝试恢复,然后在自动解决方案失败时做任何它应该做的事情(提醒用户,安排稍后尝试,或其他)。
如果您找到执行此操作的代码:
try
{
// do something that could throw
// ...
}
catch {} //swallow the exception
或:
catch { return null; }
那可能坏了。当然,有时您调用的代码会抛出您并不关心的异常。但是我经常看到人们这样做只是为了他们不必在上游“处理”异常;这种做法使事情更难调试。
有些人认为允许异常向上级联责任链是不好的,因为你只是“希望”上游的某个人“奇迹般地”知道该做什么。那些人错了。上游代码通常是唯一可以知道该做什么的地方。
偶尔,我会尝试/捕获并抛出一个不同的、更合适的异常。但是,如果可能,保护子句会更好。例如。 if (argument==null) throw new ArgumentNullException(); 比允许 NullReferenceException 向上传播调用堆栈更好,因为它更清楚出了什么问题。
一些“不应该发生”或“我不知道会发生”的情况可能应该被记录下来(例如,参见 jboss 日志记录),但可以在它们导致您的应用程序崩溃之前被吞下,至少在某些情况下例。
预计到达时间:接受一个特定的异常然后显示一个一般的、模棱两可的错误消息可能是错误的。对于上面的第二个例子,这对我来说听起来很糟糕。对于你的第一个,“找不到文件”,这可能更合理(如果你真的捕获了那个特定的异常,而不仅仅是“一切”),除非你有更好的方法来处理其他地方的这种情况。模态消息框对我来说通常是一种糟糕的“交互设计味道”,但这主要不是重点。
关于c# - 预防性与 react 性 C# 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/401090/
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一