C# C用相同的方法抛出异常和catch为什么不好?
对一个实现进行一些讨论:C# C用相同的方法抛出异常和catch为什么不好?,c#,.net,code-structure,C#,.net,Code Structure,对一个实现进行一些讨论: // Pseudocode accessor type GetValue() { try { do some action with possible throw exception1 do some action with possible throw exception2 return value; } catch (Exception ex) { value
// Pseudocode
accessor type GetValue()
{
try
{
do some action with possible throw exception1
do some action with possible throw exception2
return value;
}
catch (Exception ex)
{
value = default;
throw Wraped in Meaningfull Exception ex
}
}
有人能解释一下为什么在同一个方法中使用try-catch这样的throw和catch来安全地执行某些操作并拒绝不同类型的类似异常可能是一个糟糕的设计吗 它没有重新催促
这是错误的,但抓住了所有的例外
catch (Exception ex) {
...
}
这是一个糟糕的设计:它掩盖了潜在的危险行为。让我们看看原因。假设我们像这样使用GetValue:
try {
someValue = GetValue();
}
catch (WrapedException) {
// We failed to obtain someValue;
// The reason - WrapedException - is innocent
// Let's use default value then
someValue = defaultSomeValue;
}
实际情况是
public GetValue() {
try {
do some action with possible throw exception1
// Catastrophy here: AccessViolationException! System is in ruins!
do some action with possible throw exception2
return value;
}
catch (Exception ex) { // AccessViolationException will be caught...
// ...and the disaster will have been masked as being just WrapedException
throw new WrapedException("MyNewMessage", ex);
}
}
如果只捕获预期的异常类型,则设计正常:
public GetValue() {
try {
do some action with possible throw exception1
do some action with possible throw exception2
return value;
}
catch (FileNotFound ex) {
// File not found, nothing special in the context of the routine
throw new WrapedException("File not found and we can't load the CCalue", ex);
}
}
这并不总是一个糟糕的设计,在某些情况下可能是相当有意义的。由于许多原因,它没有多大意义。例如,根据单一责任原则,如果您验证一些输入参数,抛出一个异常并在同一个方法中捕获它-您在这个方法中甚至在这个类中做了很多事情。通过简单的if语句也可以做到这一点。重新抛出是另一种情况,但我建议提取在不同方法中抛出异常的代码,以便更好地阅读。如果ex是一个异常呢?AccessViolationException?@apomene你能提供一个实际使用的例子吗?我看不出有什么有用的案例。唯一的情况是当你想将一个异常从一个线程重新提交到主线程时。唯一实用的答案是这取决于VTCThanks是否有意义!基本上是在
public GetValue() {
try {
do some action with possible throw exception1
do some action with possible throw exception2
return value;
}
catch (FileNotFound ex) {
// File not found, nothing special in the context of the routine
throw new WrapedException("File not found and we can't load the CCalue", ex);
}
}