常见异常处理程序

时间:2017-09-22 07:55:01

标签: c# c++ exception exception-handling

有一个很棒的应用程序,代码中包含数千个异常处理程序,如:

try {
   ...
}
catch (OurException ex) {
   ...
}

现在请求是,如果OurException.Code == NNN,那么应该完成一些额外的特殊任务。永远,无处不在。 是否有更好/更快的方式而不是改变数千个源位置,如:

void HandleSpecialCase(OurException ex) { 
   if (ex.Code == NNN) ... 
}

try {
   ...
}
catch (OurException ex) {
   HandleSpecialCase(ex);
   ... rest
} 

对C#或C ++的任何想法都将不胜感激。

编辑:我的问题非常关注:我不想通过代码中的所有成千上万的异常处理程序查看所有数千个源文件,并逐个更改

3 个答案:

答案 0 :(得分:0)

不知道C#,但在C ++中,如何使用多态?

class OurException {
  virtual void handle() = 0;
};

class SpecialCaseException : public OurException {
  static const int code = NNN;

  virtual void handle() {
     // do what you need to
  }
};

然后你只需使用:

try {
  // ...
} catch (OurException& ex) {
  // This is executed for OurException and all its derived classes
  ex.handle();
  // ... rest
}

异常已经很昂贵(抛出时),所以我认为运行时数据类型检查的成本不会产生很大影响。

如果您不想更改try / catch块,则解决方案将不会干净。可能也不正确,但您可以尝试以下方法:

class OurException {
  OurException( Code c ) :
     code(c)
  {
     if( c == NNN ) {
        // handle special case
     }
  }
};

请注意,在抛出异常之前将调用构造函数。

答案 1 :(得分:0)

如果您没有找到特定于语言的答案,一个选项可能是使用PowerShell使用(OurException .. {获取代码中所有位置的列表,然后运行另一个脚本以在下一行中插入HandleSpecialCase(ex);。粗糙的方式,但它将为大多数地点做好工作。

下面会找到所有文件

ls -Path . -Filter *.java  -File -Recurse | Select-String -Pattern "\(Exception" | ft path, LineNumber, Line | out-file exceptionlocations.txt

这可以验证是否找到了正确的实例。

然后,您可以编写powershell脚本,该脚本将首先使用行

枚举所有位置
$locations = ls -Path . -Filter *.java  -File -Recurse | Select-String -Pattern "\(Exception"

在循环中运行此输出以使用get-content读取文件内容,这将在数组中提供它,在我们找到匹配的行之后在数组中插入行HandleSpecialCase(ex);,然后使用{{1}将整个数组写回到同一文件路径。

答案 2 :(得分:0)

在我看来,你不想要

.done(function (data) {
    swal({
        title: 'Thank you for your order',
        type: 'success',
        html: data
    });
});

但是

try {
}
catch (MyException e) {
    switch(e.code) {
    }
}

如果你想在每个catch中完成同样的事情,那么你可以编写一个替换' catch(MyException)'与其他一切。