捕获异常并重新抛出异常时需要考虑哪些最佳实践?我想确保保留Exception对象InnerException和堆栈跟踪.以下代码块在处理此方式时是否存在差异?
try
{
//some code
}
catch (Exception ex)
{
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
VS:
try
{
//some code
}
catch
{
throw;
}
Run Code Online (Sandbox Code Playgroud) 我有时会看到
try {
} catch(Throwable e) {
}
Run Code Online (Sandbox Code Playgroud)
而有时
try {
} catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
有什么不同
我不知道为什么我们需要finally在try...except...finally声明中.在我看来,这个代码块
try:
run_code1()
except TypeError:
run_code2()
other_code()
Run Code Online (Sandbox Code Playgroud)
与使用finally以下内容相同:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
令我遗憾的是,我无法弄清楚如何处理python'with'语句的异常.如果我有一个代码:
with open("a.txt") as f:
print f.readlines()
Run Code Online (Sandbox Code Playgroud)
我真的想处理'文件未找到异常'以便进行处理.但我不能写
with open("a.txt") as f:
print f.readlines()
except:
print 'oops'
Run Code Online (Sandbox Code Playgroud)
并且不能写
with open("a.txt") as f:
print f.readlines()
else:
print 'oops'
Run Code Online (Sandbox Code Playgroud)
在try/except语句中包含'with'不起作用:不引发异常.为了以Pythonic方式处理'with'语句内部的失败,我该怎么办?
如果finally块抛出异常,究竟会发生什么?
具体来说,如果在finally块的中途抛出异常会发生什么.是否调用了此块中的其余语句(之后)?
我知道异常会向上传播.
是否可以使用ELMAH执行以下操作?
logger.Log(" something");
Run Code Online (Sandbox Code Playgroud)
我正在做这样的事情:
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
Run Code Online (Sandbox Code Playgroud)
ELMAH不会自动记录此异常,因为它已被处理.
使用Microsoft for .NET的异步CTP,是否可以捕获调用方法中异步方法抛出的异常?
public async void Foo()
{
var x = await DoSomethingAsync();
/* Handle the result, but sometimes an exception might be thrown.
For example, DoSomethingAsync gets data from the network
and the data is invalid... a ProtocolException might be thrown. */
}
public void DoFoo()
{
try
{
Foo();
}
catch (ProtocolException ex)
{
/* The exception will never be caught.
Instead when in debug mode, VS2010 will warn and continue.
The deployed the app will simply crash. …Run Code Online (Sandbox Code Playgroud) c# asynchronous exception-handling task-parallel-library async-await
我在另一个问题中看到了这个提示,并想知道是否有人可以向我解释这是如何工作的?
try { return x; } finally { x = null; }
Run Code Online (Sandbox Code Playgroud)
我的意思是,该finally条款真正执行后的return声明?这段代码的线程不安全吗?你能想到这个try-finally黑客可以做的任何额外的hackery 吗?
捕获将如此打印的异常:
Traceback (most recent call last):
File "c:/tmp.py", line 1, in <module>
4 / 0
ZeroDivisionError: integer division or modulo by zero
Run Code Online (Sandbox Code Playgroud)
我想将其格式化为:
ZeroDivisonError, tmp.py, 1
Run Code Online (Sandbox Code Playgroud) 我们有一个WPF应用程序,其中部分可能会在运行时抛出异常.我想全局捕获任何未处理的异常并记录它们,但是否则会继续执行程序,好像什么也没发生(有点像VB On Error Resume Next).
这可能在C#中吗?如果是这样,我究竟需要将异常处理代码放在哪里?
目前我看不到任何可以包装a try/ catcharound的单点,哪些可以捕获可能发生的所有异常.即便如此,由于捕获,我会留下任何被执行的东西.或者我在这里想到可怕的错误方向?
ETA:因为下面有很多人指出:该申请不是用于控制核电厂.如果它崩溃了并不是什么大问题,但是大多数与UI相关的随机异常在它将被使用的上下文中是一种麻烦.有(也可能仍然是)其中一些,因为它使用插件架构,可能会被其他人扩展(在这种情况下也是学生;所以没有经验丰富的开发人员能够编写完全无错误的代码).
至于被捕获的异常:我将它们记录到日志文件中,包括完整的堆栈跟踪.这就是这项工作的重点.只是为了对抗那些在字面上对VB的OERN进行类比的人.
我知道盲目忽略某些类错误是危险的,可能会破坏我的应用程序实例.如前所述,这个程序对任何人来说都不是关键任务.在他们正确的思想中没有人会打赌人类文明的存在.它只是一个用于测试某些设计方法的小工具.软件工程.
为了立即使用该应用程序,异常可能会发生很多事情:
对于程序生成的实验数据:严重错误最坏的情况是不会导致数据被记录.稍微改变实验结果的微妙变化是不太可能的.即使在这种情况下,如果结果看起来很可疑,则会记录错误; 如果它是一个完整的异常值,那么仍然可以丢弃该数据点.
总结一下:是的,我认为自己仍然至少部分理智,我不认为一个全局异常处理例程让程序运行必然是完全邪恶的.如前所述,根据申请,这样的决定可能是有效的.在这种情况下,它被认为是一个有效的决定,而不是完全和彻底的废话.对于任何其他应用程序,决策可能看起来不同 但请不要因为我们忽视错误而指责我或其他从事该项目的人可能会炸毁这个世界.
附注:该应用程序只有一个用户.数百万人使用的不是像Windows或Office这样的东西,在这种情况下,向用户提供异常泡沫的成本本来就是非常不同的.
c# ×6
exception ×4
python ×3
.net ×2
async-await ×1
asynchronous ×1
elmah ×1
java ×1
rethrow ×1
stack-trace ×1
throwable ×1
try-finally ×1
wpf ×1