我需要捕获两个异常,因为它们需要相同的处理逻辑.我想做的事情如下:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
Run Code Online (Sandbox Code Playgroud)
是否可以避免重复每个catch块中的处理程序代码?
如何获取Python中引发的异常的名称?
例如,
try:
foo = bar
except Exception as exception:
name_of_exception = ???
assert name_of_exception == 'NameError'
print "Failed with exception [%s]" % name_of_exception
Run Code Online (Sandbox Code Playgroud)
例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印异常的名称.
我经常在C++中使用的东西是让一个类通过构造函数和析构函数A处理另一个类的状态入口和退出条件,以确保如果该范围内的某些东西抛出异常,那么B将具有已知状态范围已退出.就首字母缩略词而言,这不是纯粹的RAII,但它仍然是一种既定的模式.BA
在C#中,我经常想做
class FrobbleManager
{
...
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
this.Frobble.Lock();
}
}
Run Code Online (Sandbox Code Playgroud)
这需要像这样做
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
try
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
finally
{
this.Frobble.Lock();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想保证退货Frobble时的状态FiddleTheFrobble.代码会更好
private void FiddleTheFrobble()
{
using (var janitor = new FrobbleJanitor(this.Frobble))
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw …Run Code Online (Sandbox Code Playgroud) 我想从文本文件中读取文本.在下面的代码中,发生异常(这意味着它进入catch块).我把文本文件放在应用程序文件夹中.我应该把这个文本文件(mani.txt)放在哪里才能正确读取它?
try
{
InputStream instream = openFileInput("E:\\test\\src\\com\\test\\mani.txt");
if (instream != null)
{
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line,line1 = "";
try
{
while ((line = buffreader.readLine()) != null)
line1+=line;
}catch (Exception e)
{
e.printStackTrace();
}
}
}
catch (Exception e)
{
String error="";
error=e.getMessage();
}
Run Code Online (Sandbox Code Playgroud) 更新:请参阅下面的"已接受"解决方案
当我的应用创建未处理的异常,而不是简单地终止时,我想首先让用户有机会发送日志文件.我意识到在获得随机异常后做更多的工作是有风险的,但是,嘿,最糟糕的是应用程序完成崩溃并且日志文件没有被发送.结果比我想象的更棘手:)
什么有效:(1)捕获未捕获的异常,(2)提取日志信息并写入文件.
什么不起作用:(3)开始发送电子邮件的活动.最终,我还有另一项活动要求用户的许可.如果我让电子邮件活动正常工作,我不会对另一方感到麻烦.
问题的关键是我的Application类中捕获了未处理的异常.由于这不是一个Activity,因此如何使用Intent.ACTION_SEND启动活动并不明显.也就是说,通常在启动一个活动时,调用startActivity并使用onActivityResult恢复.Activity支持这些方法,但Application不支持.
有关如何做到这一点的任何建议?
以下是一些代码剪辑作为入门指南:
public class MyApplication extends Application
{
defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler();
public void onCreate ()
{
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
}
private void handleUncaughtException (Thread thread, Throwable e)
{
String fullFileName = extractLogToFile(); // code not shown
// The following shows what I'd like, though it won't work like this.
Intent intent = new Intent (Intent.ACTION_SEND);
intent.setType ("plain/text");
intent.putExtra (Intent.EXTRA_EMAIL, new …Run Code Online (Sandbox Code Playgroud) 我的一个方法(Method1)产生一个新线程.该线程执行一个方法(Method2),并在exectution期间抛出异常.我需要获取有关调用方法的异常信息(Method1)
在某种程度上,我可以捕获这个Method1被抛出的异常Method2吗?
我几乎肯定答案是肯定的.如果我使用Try Finally块但不使用Catch块,那么任何异常都会冒泡.正确?
一般的做法有什么想法吗?
赛斯
这是我想要向异常添加一些信息时经常做的一个例子:
std::stringstream errMsg;
errMsg << "Could not load config file '" << configfile << "'";
throw std::exception(errMsg.str().c_str());
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
在Real World Haskell的第19章中,很多例子现在因为改变而失败了Control.Exception.
这让我觉得也许本书中的一些内容实际上已经过时,不再值得学习,毕竟它已经有6年了.我唯一的另一个参考是" 了解你是一个很好的Haskell",虽然它是一本很棒的书,但与RWH相比它更为基础.
任何读过这本书的人都可以就哪些部分不再相关提出一些建议吗?特别是本书后半部分的章节,例如软件事务内存,并发编程,套接字编程等.
编辑:这是关于2008年12月出版的书的版本,这是迄今为止唯一的已知版本(2017年11月)
好吧,这很简单:
Application.ThreadException和之间有什么区别AppDomain.CurrentDomain.UnhandledException?
我需要处理两者吗?
谢谢!