该Go语言的创造者写的:
Go不提供断言.它们无疑是方便的,但我们的经验是程序员将它们用作拐杖以避免考虑正确的错误处理和报告.正确的错误处理意味着服务器在非致命错误而不是崩溃后继续运行.正确的错误报告意味着错误是直接的,并且可以避免程序员解释大的崩溃跟踪.当程序员看到错误时不熟悉代码时,精确错误尤为重要.
你对此有何看法?
我已经阅读了很多关于如何以及何时使用断言的文章(以及在StackOverflow上发布的其他几个类似问题),我对它们理解得很好.但是,我仍然不明白应该驱使我使用什么样的动机Debug.Assert而不是抛出一个普通的例外.我的意思是,在.NET中,对失败的断言的默认响应是"停止世界"并向用户显示一个消息框.虽然可以修改这种行为,但我觉得这样做非常烦人和多余,而我可以改为抛出一个合适的异常.这样,我可以在抛出异常之前轻松地将错误写入应用程序的日志,而且,我的应用程序不一定会冻结.
那么,为什么我应该使用Debug.Assert而不是普通的例外呢?将断言放在不应该出现的地方可能会导致各种"不需要的行为",所以在我看来,我真的没有通过使用断言而不是抛出异常来获得任何东西.你同意我的意见,还是我在这里遗漏了什么?
注意:我完全理解"在理论上"(调试与发布,使用模式等)之间的区别是什么,但正如我所看到的,我最好抛出异常而不是执行断言.因为如果在生产版本上发现了一个bug,我仍然希望"断言"失败(毕竟,"开销"非常小),所以我最好不要抛出异常.
编辑:我看到它的方式,如果断言失败,这意味着应用程序进入某种已损坏的意外状态.那么我为什么要继续执行呢?应用程序是否在调试版或发行版上运行并不重要.两者都是如此
我正在开发一个生成设备报告的库.generate_report (const std::string& no)由于各种原因,成员函数可能会失败:
report_generator是FSM)哪种错误处理机制最适合这些错误?
true或false一些上下文信息:正常的工作流程如下.用户激活设备,从列表中选择报告并单击"生成".
编辑:感谢您的回复!对我来说,现在很清楚何时使用断言以及何时进行错误处理.至于错误处理,错误代码和异常都有利有弊.我想我会考虑异常(并为上述错误创建四个类),但我还不确定.我总是想到"意外情况"的例外情况.无效的报告编号并非真正意外.有什么建议?:)
我想为excel创建"案例"公式来模拟选择案例行为(带有多个参数,否则可选).如果A1和A2是excel单元格,那么这就是目标:
A1 Case: A2 Formula: A2 Result
5 cases({A1>5,"greather than 5"}, {A1<5, "less than 5"},{else,"equal to 5"}) equal to 5
Hi cases({A1="","there is nothing"},{else,A1}) Hi
1024 cases({5<A1<=10,10},{11<=A1<100,100},{A1>100,1000}) 1000
12 cases({A1=1 to 9, "digit"}, {A1=11|22|33|44|55|66|77|88|99, "11 multiple"}) (empty)
60 cases({A1=1 to 49|51 to 99,"not 50"}) not 50
Run Code Online (Sandbox Code Playgroud)
如果可以,它必须接受excel公式或vba代码,才能在获取案例之前对单元格进行操作,ig
cases({len(A1)<7, "too short"},{else,"good length"})
Run Code Online (Sandbox Code Playgroud)
如果可以,它必须接受或更多的细胞来评估,ig
如果A2 = A3 = A4 = A5 = 1且A1 = 2,A6 ="1",A7 ="2"
cases(A1!=A2|A3|A4|A5, A6}, {else,A7}) will produce "two"
Run Code Online (Sandbox Code Playgroud)
顺便说一下,| 意思是,或者!=意味着不同
有帮助吗?
我很感激.
我能写的是这个:
Public Function arr(ParamArray args()) …Run Code Online (Sandbox Code Playgroud) 我从SO复制一段代码作为例子.子例程包含错误处理程序.是否应该为所有Subs制作错误处理程序?
Public Sub SubA()
On Error Goto ProcError
Connection.Open
Open File for Writing
SomePreciousResource.GrabIt
ProcExit:
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
Run Code Online (Sandbox Code Playgroud)
顺便说一下,如何做一个子程序内部的控制流时,代码执行遇到Exit Sub,End Sub和Resume?当它遇到诸如ProcError:执行期间的标签时,它是执行它还是跳过它?
在我的一个代码中,如果我收到错误,我需要弹出文件名错误,然后继续下一步.Below是我试图使用的代码片段,但它给了我错误.谁能帮我
sourcefilename = File_list.Cells(i + 1, 1)
Set Baccha_Wbk = Wbk.Workbooks.Open(sourcefilename)
On Error GoTo ErrMsg
ErrMsg: MsgBox ("Error in file" & sourcefilename ),On Error Resume Next
Run Code Online (Sandbox Code Playgroud) 我有一些遗留的Excel文件,包含大量对存储过程和数据库连接的调用,所有这些都是以记录集的旧方式完成的...
因为在VBA中没有try-catch的概念 - 最终在.NET中有什么最佳实践可以应用于拥有更加可靠的数据访问层?我想有一个很好的例子,说明如何打开连接,执行需要一些参数的存储过程,然后在任何情况下成功或错误,关闭连接并释放资源.
我没有读过太多关于它的内容,但是下面链接的作者建议我不要使用"冒泡"来集中VBA中的错误处理.
但我不确定他为什么这么推荐,而且他没有真正解释.
有人能告诉我为什么我应该在每个程序中使用错误处理而不是使用"冒泡"吗?或者至少,你知道为什么作者说不?
谢谢.