我主要是为技术精明的人编写一个小工具,例如程序员、工程师等,因为这些工具通常是快速的,随着时间的推移,我知道会有未处理的异常,用户不会介意。我希望用户能够向我发送回溯,这样我就可以检查发生了什么,并可能改进应用程序。
我通常做wxPython编程,但我最近做了一些Java。我已经将TaskDialog/code>类连接到
线程.UnaughtExceptionHandler()
,我对结果非常满意。特别是它可以捕获和处理来自任何线程的异常:
我在wxPython中做了很长一段时间类似的事情。然而:
- 我必须编写一个decorator-hack,以便能够很好地打印来自另一个线程的异常。
- 即使是函数,结果也相当糟糕。
下面是Java和wxPython的代码,您可以看到我所做的工作:
Java:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import com.ezware.dialog.task.TaskDialogs;
public class SwingExceptionTest {
private JFrame frame;
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException e) {
}
catch (InstantiationException e) {
}
catch (IllegalAccessException e) {
}
catch (UnsupportedLookAndFeelException e) {
}
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
TaskDialogs.showException(e);
}
});
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SwingExceptionTest window = new SwingExceptionTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public SwingExceptionTest() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[]{0, 0};
gridBagLayout.rowHeights = new int[]{0, 0};
gridBagLayout.columnWeights = new double[]{0.0, Double.MIN_VALUE};
gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
frame.getContentPane().setLayout(gridBagLayout);
JButton btnNewButton = new JButton("Throw!");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
onButton();
}
});
GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
gbc_btnNewButton.gridx = 0;
gbc_btnNewButton.gridy = 0;
frame.getContentPane().add(btnNewButton, gbc_btnNewButton);
}
protected void onButton(){
Thread worker = new Thread() {
public void run() {
throw new RuntimeException("Exception!");
}
};
worker.start();
}
}
import StringIO
import sys
import traceback
import wx
from wx.lib.delayedresult import startWorker
def thread_guard(f):
def thread_guard_wrapper(*args, **kwargs) :
try:
r = f(*args, **kwargs)
return r
except Exception:
exc = sys.exc_info()
output = StringIO.StringIO()
traceback.print_exception(exc[0], exc[1], exc[2], file=output)
raise Exception("<THREAD GUARD>\n\n" + output.getvalue())
return thread_guard_wrapper
@thread_guard
def thread_func():
return 1 / 0
def thread_done(result):
r = result.get()
print r
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label="Throw!")
self.button.Bind(wx.EVT_BUTTON, self.OnButton)
self.sizer = wx.BoxSizer()
self.sizer.Add(self.button)
self.panel.SetSizerAndFit(self.sizer)
self.Show()
def OnButton(self, e):
startWorker(thread_done, thread_func)
app = wx.App(True)
win = MainWindow(None, size=(600, 400))
app.MainLoop()
我能轻松地在wxpython中做一些类似Java解决方案的事情吗?或者,在Java或wxpython中有更好的方法吗?
在Python中,您可以将sys.execpthook
设置为要为未捕获的异常调用的函数。那么您就不需要修饰器了,您可以在钩子函数中集中处理异常。
不只是打印异常回溯文本并让它显示在stock stdout窗口中,您可以用它做一些更智能的事情,比如使用对话框来显示文本,并具有允许用户将错误信息发送回开发人员、忽略将来的错误、重新启动应用程序或任何您想要的控件。
问题内容: 我目前正在学习如何正确执行自定义异常的过程,偶然发现了一个问题。每当我尝试利用引发此自定义异常的类的对象时,IDE的调试器(我使用的是IntelliJ想法)都会说“未处理的异常:InsertExceptionName()”。代码以简化的方式看起来像这样。在这种情况下,如果随机生成的数字<0.5,它将返回一个异常,否则返回一个数字,但不会这样做。我想念什么? -- -- 问题答案: 您是
问题内容: 我正在开发一个Android应用,该应用必须将json格式的Java对象保存到SQLite数据库中。我为此操作编写了代码,然后他们必须提取Json对象并将其重新转换为Java对象。当我尝试调用将json对象反序列化为字符串的方法时,我在Android Studio中发现此错误: 当我尝试捕获程序运行但不反序列化json对象时。 这是该方法的代码: 你能帮我吗? 问题答案: 是的,您需要
问题内容: 它在DEBUG = True模式下运行。有时,当遇到错误时,它可能会抛出带有追溯信息的错误消息,但有时,它仅显示以下行: 我必须切换到开发服务器才能查看详细消息。 遇到错误时,如何使它始终显示回溯消息? 问题答案: 也许你可以使用此代码段,这会将异常记录在apache的日志中: 把它放在你的settings.py: 在你的代码中:
我已经浏览了所有相关的帖子,但是我的@Controlller建议似乎没有处理从Controller类抛出的自定义异常。但是@Controller类中的@ExceptionHandler确实处理了异常。我不知道是什么错误。 网状物xml: dispatcher servlet。xml: @控制器建议等级: @ControllerAdvice与控制器位于同一个包中。
问题内容: 如果我在.NET中没有记错的话,可以为未处理的异常注册“全局”处理程序。我想知道Java是否有类似的东西。 问题答案: 是的,有,但只有在没有设置时才会触发。
下面是我的代码片段: 现在java用'unhandled exception type SQLException)标记指示语句(以及后面的所有语句)。gfsql.dosql抛出此异常并定义为: public ResultSet doSQL(String sqlCommand)抛出SQLException{ 有趣的是--如果我像这样重复“catch”块: 未标记“未处理”错误。(但是,重复的catc