相关疑难解决方法(0)

在Excel VSTO中,如何检查工作表是否属于已关闭的工作簿?

如果我有一个引用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不提供一个(这真的很烦人).

有没有一些方便的方法来确保我不使用这些工作表?

c# com excel vsto comexception

5
推荐指数
1
解决办法
4780
查看次数

累积验证违规的设计模式

让我们想象一下,我们有一个进程,它接受以下类型的数据:

{"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 验证

使用哪种设计模式进行验证

为什么不使用异常作为常规控制流?

java validation design-patterns exception-handling

5
推荐指数
1
解决办法
3340
查看次数

Try、Catch、Finally 中抛出异常 VS 返回错误

我很确定我已经知道答案,但我仍然很好奇在 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)

这不是最好的例子,但为了简洁起见,我想说明重复代码的要点。

众所周知,异常会导致性能损失,但是对于这种情况有何想法呢?

exception try-catch try-catch-finally

4
推荐指数
1
解决办法
3万
查看次数

如何避免 File.Exists/File.Delete 或 Directory.Exists/Directory.Delete 中的竞争

if (Directory.Exists(dir))
    Directory.Delete(dir, true);
Run Code Online (Sandbox Code Playgroud)

上面的代码检查该目录是否存在,如果存在,则将其删除。在存在检查和删除之间,目录有可能被添加或删除。

除了调用 .Delete 并丢弃异常之外,是否有适当的方法来防止这种竞争条件?

编辑:

避免与异常处理竞争的原因是因为异常不应该用于控制流。

理想的解决方案是某种文件系统锁?

.net file-io

4
推荐指数
1
解决办法
556
查看次数

"抛出新的ZygoteInit.MethodAndArgsCaller"如何清理堆栈帧?

我是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调用?但问题和答案都没有解释清理工作.

异常会导致堆栈回收工作吗?

java android

4
推荐指数
1
解决办法
460
查看次数

如何在没有大量IF的情况下控制执行?

我有一个进程,从文件导入数据开始,然后执行一系列过程,但在任何时候它都可以找到问题,应该停止执行其余的并运行另一组.

这是我的示例,其中每个过程设置全局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)

delphi delphi-xe7

4
推荐指数
1
解决办法
374
查看次数

控制流程的例外情况

关于跨应用程序的控制流程,这里一个有趣的帖子.

好吧,最近,我遇到了一个有趣的问题.在潜在(实际上)无限递归序列中生成第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进行流量控制.有没有借口?如果你要实现它,你将如何构建这样的东西呢?

algorithm exception control-flow data-structures

3
推荐指数
1
解决办法
1776
查看次数

成功时抛出与假冒伪劣对比函数数组与goto语句

考虑一个应该提供参数建议的类,给出一些线索和特定的验收测试.

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)

c++ design-patterns readability

3
推荐指数
1
解决办法
239
查看次数

如何在访问哈希内部的哈希时处理潜在的错误?

有时在处理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,但我不确定这是否是最好的方式来解决它,如果它甚至可能.

ruby hash

3
推荐指数
2
解决办法
2232
查看次数

在Ruby中使用str.to_f时如何确定数值?

我试图捕捉数字字符串与任意字符串之间的区别:

'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则程序应输出正确的华氏度计算.

ruby floating-point boolean

3
推荐指数
1
解决办法
324
查看次数