之间有什么区别
try { } catch { throw; }
和
try { } catch(Exception e) { throw e;}
?
我什么时候应该使用另一个?
建筑
try { ... } catch () { ... } /* You can even omit the () here */ try { ... } catch (Exception e) { ... }
两者相似,因为两者都将捕获块中抛出的 每个 异常try(并且,除非您只是使用它来记录异常,否则应 避免 )。现在看看这些:
try
try { ... } catch () { /* ... */ throw; } try { ... } catch (Exception e) { /* ... */ throw; } try { ... } catch (Exception e) { /* ... */ throw e; }
第一个try-catch块和第二个try-catch块完全相同,它们只是重新抛出当前异常,并且该异常将保留其“源”和堆栈跟踪。
第三个try-catch块是不同的。当它引发异常时,它将更改源和堆栈跟踪,以便看起来已从此方法引发异常,从throw e包含try- catch块的方法的那一行开始。
throw e
您应该使用哪一个?这实际上取决于每种情况。
假设您有一个Person带有.Save()将其持久化到数据库中的方法的类。假设您的应用程序在Person.Save()某处执行该方法。如果您的数据库拒绝保存Person,.Save()则将引发异常。您应该使用throw还是throw e在这种情况下?这要看情况。
Person
.Save()
Person.Save()
throw
我更喜欢做的是:
try { /* ... */ person.Save(); } catch(DBException e) { throw new InvalidPersonException( "The person has an invalid state and could not be saved!", e); }
这应该将DBException作为正在抛出的较新异常的“内部异常”。因此,当您检查此InvalidPersonException时,堆栈跟踪将包含返回Save方法的信息(这可能足以解决问题),但是如果需要,您仍然可以访问原始异常。
最后一点,当您 期望 一个异常时,您应该确实捕获该特定的异常,而不是一般的异常Exception,即,如果您期望一个InvalidPersonException,则您应该首选:
Exception
try { ... } catch (InvalidPersonException e) { ... }
至
try { ... } catch (Exception e) { ... }
祝好运!