如果我有一个引用Worksheet并且我关闭它的父级Workbook,则引用不会消失.但我无法弄清楚我应该如何检查以确保这些表不存在.检查null不起作用.
例:
Workbook book = Globals.ThisAddIn.Application.ActiveWorkbook;
Worksheet sheet = (Worksheet)book.Worksheets[1]; // Get first worksheet
book.Close(); // Close the workbook
bool isNull = sheet == null; // false, worksheet is not null
string name = sheet.Name; // throws a COM Exception
Run Code Online (Sandbox Code Playgroud)
这是我尝试访问工作表时遇到的异常:
System.Runtime.InteropServices.COMException was caught
HResult=-2147221080
Message=Exception from HRESULT: 0x800401A8
Source=MyProject
ErrorCode=-2147221080
StackTrace:
at Microsoft.Office.Interop.Excel._Worksheet.get_Name()
at MyCode.test_Click(Object sender, RibbonControlEventArgs e) in c:\MyCode.cs:line 413
InnerException:
Run Code Online (Sandbox Code Playgroud)
如果我可以检查工作簿删除事件,这甚至不是问题,但Excel不提供一个(这真的很烦人).
有没有一些方便的方法来确保我不使用这些工作表?
让我们想象一下,我们有一个进程,它接受以下类型的数据:
{"date":"2014-05-05", "url":"http://some.website.com","counter":3}
Run Code Online (Sandbox Code Playgroud)
date应该是一个可解析的日期,url也应该符合正常的 url 语法。date应该在未来,url应该是一个可访问的地址,返回200 OK.为了使它干净,必须将这两个验证例程分成不同的单元(类、实用程序等)。然而,所需的最终行为必须让用户清楚地了解数据中存在的所有违规行为。就像是:
{"Errors":[
"Specified date is not in the future",//Formal validation failed
"Specified URL has invalid syntax"//Logical validation failed
]}
Error对象的实现,并且充满了像Error.hasErrors()or之类的检查
error==null,这看起来并不优雅。javax.validation,它同时为您提供所有领域的所有违规行为。可以为内容验证实施相同的方法,但我不确定这是执行此操作的最佳方法。问题:处理各种性质的多个异常/违规的最佳做法是什么?
UPD:答案的简短摘要: collect Violations, build an Exception,包含它们的上下文、原因和描述,使用拦截器进行渲染。请参阅答案中的参考链接:
http://beanvalidation.org/1.0/spec/ JSR 303 规范
http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html Spring Bean 验证
http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html Java EE 验证
我很确定我已经知道答案,但我仍然很好奇在 Try、Catch、Finally 块中处理错误的意见是什么 -但是当您重复自己时。
顺便说一句 - 我不是在谈论用户输入 - 而是使用它作为示例,因为它清晰且简短
考虑这段代码...
try {
if (success) {
return someSuccessMessage;
}
else {
logError("User input not correct format");
return someErrorMessage; // repeats itself
}
}
catch (Exception ex) {
logError(ex.Message);
return someErrorMessage; // repeats itself
}
Run Code Online (Sandbox Code Playgroud)
假设我们有一个函数,如果它失败了,我们想返回一条错误消息,因为异常是无关紧要的——我们的函数没有成功,用户不需要任何额外的细节。
我一直坚信,如果你能处理错误,就避免异常——因为它不再是异常了,但我想知道关于避免重复自己的意见......你可以执行以下操作来避免重复你自己...
try {
if (success) {
return someSuccessMessage;
}
else {
throw new Exception("User input not correct format");
}
}
catch (Exception ex) {
logError(ex.Message);
return someErrorMessage;
}
Run Code Online (Sandbox Code Playgroud)
这不是最好的例子,但为了简洁起见,我想说明重复代码的要点。
众所周知,异常会导致性能损失,但是对于这种情况有何想法呢?
if (Directory.Exists(dir))
Directory.Delete(dir, true);
Run Code Online (Sandbox Code Playgroud)
上面的代码检查该目录是否存在,如果存在,则将其删除。在存在检查和删除之间,目录有可能被添加或删除。
除了调用 .Delete 并丢弃异常之外,是否有适当的方法来防止这种竞争条件?
编辑:
避免与异常处理竞争的原因是因为异常不应该用于控制流。
理想的解决方案是某种文件系统锁?
我是Java和Android的初学者,在阅读Zygote init代码后我感到困惑.
在Zygote分配一个子进程后,在它结束时invokeStaticMain,它会抛出一个
throw new ZygoteInit.MethodAndArgsCaller(m, argv)
Run Code Online (Sandbox Code Playgroud)
这是ZygoteInit.main由执行子进程工作的catch块处理的
catch (MethodAndArgsCaller caller) {
caller.run();
}
Run Code Online (Sandbox Code Playgroud)
评论throw new ZygoteInit.MethodAndArgsCaller说它将清理设置过程所需的所有堆栈帧.
但我无法弄清楚如何清理堆栈帧.我检查了相关的SO问题,什么是ZygoteInit调用?但问题和答案都没有解释清理工作.
异常会导致堆栈回收工作吗?
我有一个进程,从文件导入数据开始,然后执行一系列过程,但在任何时候它都可以找到问题,应该停止执行其余的并运行另一组.
这是我的示例,其中每个过程设置全局gStop变量,指示停止进程.如果它被停止,我需要在最后运行一些代码.
var gStop:boolean;
procedure Run;
begin
gStop:=False;
Import; // imports data from file
If Not gStop Then
AfterImport1;
If Not gStop Then
AfterImport2;
If Not gStop Then
AfterImport3;
If Not gStop Then
AfterImport4;
If Not gStop Then
If fTypeOfData = cMSSQL Then // function returns type of imported data
begin
ProcessMSSQLData1;
If not gStop Then
ProcessMSSQLData2;
If not gStop Then
ProcessMSSQLData3;
If not gStop Then
If fObjectAFoundInData Then // function checks if ObjectA was found in imported data
ProcessObjectA; …Run Code Online (Sandbox Code Playgroud) 好吧,最近,我遇到了一个有趣的问题.在潜在(实际上)无限递归序列中生成第n个值.这个特定的算法将在其成功的深度处至少10-15个堆栈引用.我的第一个想法是抛出看起来像这样的(C#)的SuccessException:
class SuccessException : Exception
{
public string Value
{ get; set; }
public SuccessException(string value)
: base()
{
Value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
然后做这样的事情:
try
{
Walk_r(tree);
}
catch (SuccessException ex)
{
result = ex.Value;
}
Run Code Online (Sandbox Code Playgroud)
然后我的思绪在这里徘徊,在那里我一遍又一遍地听到从未使用Exceptions进行流量控制.有没有借口?如果你要实现它,你将如何构建这样的东西呢?
考虑一个应该提供参数建议的类,给出一些线索和特定的验收测试.
concretise的示例: 假设您根据文件名猜测原始数据文件的立方体尺寸.验收测试是:总元素==文件大小(假设1字节pr.网格单位).
这需要优先排序测试,其中每个测试进行一次或多次尝试通过验收测试.通过的第一个建议立即返回,不再尝试.如果没有通过,建议不要.
问题:当可读性是主要问题时,您会推荐哪种模式/方法?此外,以下建议有哪些缺陷和缺点?
方法1:获得成功验收测试的例外情况
我听说智者会在没有捕获实际异常的情况下避免使用try/catch.但是,在这种情况下,结果是相当可读的,看起来像:
try {
someTest1();
someTest2();
// ...
someTestN();
}
catch(int){
// Succesfull return
xOut = x_; yOut = y_; zOut = z_;
return;
}
xOut = -1; yOut = -1; zOut = -1;
Run Code Online (Sandbox Code Playgroud)
通过内部验收测试:
void acceptanceTest(const int x, const int y, const int z)
{
if (verify(x * y * z)) {
x_ = x; y_ = y; z_ = z;
throw 1;
}
}
Run Code Online (Sandbox Code Playgroud)
方法2:Do-while-false:
更改:所有测试在通过验收测试后立即返回true.如果测试中的所有尝试都失败,则返回false.
do {
if ( someTest1() ) …Run Code Online (Sandbox Code Playgroud) 有时在处理API响应时,我最终会写一些类似于:
what_i_need = response["key"]["another key"]["another key 2"]
Run Code Online (Sandbox Code Playgroud)
问题是,如果"another key"丢失,它会抛出一个错误.我不喜欢那样.如果我是一个很多快乐what_i_need翻了nil,如果沿着过程的东西坏了.
是否有比以下更优雅的解决方案:
what_i_need = nil
begin
what_i_need = response["key"]["another key"]["another key 2"]
rescue Exception => e
end
Run Code Online (Sandbox Code Playgroud)
我还考虑过猴子修补NilClass你尝试访问nil["something"]它会返回nil,但我不确定这是否是最好的方式来解决它,如果它甚至可能.
我试图捕捉数字字符串与任意字符串之间的区别:
'0'.to_f
#=> 0.0
'hello'.to_f
#=> 0.0
Run Code Online (Sandbox Code Playgroud)
以上两者都归来了Float.如果用户输入实际值'0'或用户输入值,我如何捕捉差异'hello'?
我正在尝试创建一个简单的Celsius到华氏温度计算器.如果用户输入"hello"程序应输出,Please type in a number:但如果用户键入,0则程序应输出正确的华氏度计算.
exception ×2
java ×2
ruby ×2
.net ×1
algorithm ×1
android ×1
boolean ×1
c# ×1
c++ ×1
com ×1
comexception ×1
control-flow ×1
delphi ×1
delphi-xe7 ×1
excel ×1
file-io ×1
hash ×1
readability ×1
try-catch ×1
validation ×1
vsto ×1