java – 在GUI中处理未处理的异常

前端之家收集整理的这篇文章主要介绍了java – 在GUI中处理未处理的异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我主要为技术精通的人写一个小工具,例如程序员,工程师等等.由于这些工具通常会随着时间的推移而改进,因此我知道将会有未处理的异常,用户不会介意.我希望用户能够向我发送回溯,以便我可以检查发生了什么,并可能改进应用程序. @H_502_2@我通常做wxPython编程,但我最近做了一些Java.我已经把TaskDialog类挂接到Thread.UncaughtExceptionHandler(),我对结果很满意.特别是它可以捕获和处理任何线程的异常:

@H_502_2@我在wxPython中做了类似的工作很长一段时间.然而:

@H_502_2@>我不得不写一个装饰器,以便能够从另一个线程打印异常.
>即使在功能上,结果也相当丑陋.

@H_502_2@这里是Java和wxPython的代码,所以你可以看到我做了什么:

@H_502_2@Java的:

  1. import java.awt.EventQueue;
  2. import javax.swing.JFrame;
  3. import javax.swing.UIManager;
  4. import javax.swing.UnsupportedLookAndFeelException;
  5. import javax.swing.JButton;
  6. import java.awt.GridBagLayout;
  7. import java.awt.GridBagConstraints;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.ActionEvent;
  10.  
  11. import com.ezware.dialog.task.TaskDialogs;
  12.  
  13. public class SwingExceptionTest {
  14.  
  15. private JFrame frame;
  16.  
  17. public static void main(String[] args) {
  18.  
  19. try {
  20. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  21. }
  22. catch (ClassNotFoundException e) {
  23. }
  24. catch (InstantiationException e) {
  25. }
  26. catch (IllegalAccessException e) {
  27. }
  28. catch (UnsupportedLookAndFeelException e) {
  29. }
  30.  
  31. Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
  32. public void uncaughtException(Thread t,Throwable e) {
  33. TaskDialogs.showException(e);
  34. }
  35. });
  36.  
  37. EventQueue.invokeLater(new Runnable() {
  38. public void run() {
  39. try {
  40. SwingExceptionTest window = new SwingExceptionTest();
  41. window.frame.setVisible(true);
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. });
  47. }
  48.  
  49. public SwingExceptionTest() {
  50. initialize();
  51. }
  52.  
  53. private void initialize() {
  54. frame = new JFrame();
  55. frame.setBounds(100,100,600,400);
  56. frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  57. GridBagLayout gridBagLayout = new GridBagLayout();
  58. gridBagLayout.columnWidths = new int[]{0,0};
  59. gridBagLayout.rowHeights = new int[]{0,0};
  60. gridBagLayout.columnWeights = new double[]{0.0,Double.MIN_VALUE};
  61. gridBagLayout.rowWeights = new double[]{0.0,Double.MIN_VALUE};
  62. frame.getContentPane().setLayout(gridBagLayout);
  63.  
  64. JButton btnNewButton = new JButton("Throw!");
  65. btnNewButton.addActionListener(new ActionListener() {
  66. public void actionPerformed(ActionEvent arg0) {
  67. onButton();
  68. }
  69. });
  70. GridBagConstraints gbc_btnNewButton = new GridBagConstraints();
  71. gbc_btnNewButton.gridx = 0;
  72. gbc_btnNewButton.gridy = 0;
  73. frame.getContentPane().add(btnNewButton,gbc_btnNewButton);
  74. }
  75.  
  76. protected void onButton(){
  77. Thread worker = new Thread() {
  78. public void run() {
  79. throw new RuntimeException("Exception!");
  80. }
  81. };
  82. worker.start();
  83. }
  84.  
  85. }
@H_502_2@wxPython的:

  1. import StringIO
  2. import sys
  3. import traceback
  4. import wx
  5. from wx.lib.delayedresult import startWorker
  6.  
  7.  
  8. def thread_guard(f):
  9. def thread_guard_wrapper(*args,**kwargs) :
  10. try:
  11. r = f(*args,**kwargs)
  12. return r
  13. except Exception:
  14. exc = sys.exc_info()
  15. output = StringIO.StringIO()
  16. traceback.print_exception(exc[0],exc[1],exc[2],file=output)
  17. raise Exception("<THREAD GUARD>\n\n" + output.getvalue())
  18. return thread_guard_wrapper
  19.  
  20. @thread_guard
  21. def thread_func():
  22. return 1 / 0
  23.  
  24. def thread_done(result):
  25. r = result.get()
  26. print r
  27.  
  28.  
  29. class MainWindow(wx.Frame):
  30. def __init__(self,*args,**kwargs):
  31. wx.Frame.__init__(self,**kwargs)
  32.  
  33. self.panel = wx.Panel(self)
  34. self.button = wx.Button(self.panel,label="Throw!")
  35. self.button.Bind(wx.EVT_BUTTON,self.OnButton)
  36.  
  37. self.sizer = wx.BoxSizer()
  38. self.sizer.Add(self.button)
  39.  
  40. self.panel.SetSizerAndFit(self.sizer)
  41. self.Show()
  42.  
  43. def OnButton(self,e):
  44. startWorker(thread_done,thread_func)
  45.  
  46. app = wx.App(True)
  47. win = MainWindow(None,size=(600,400))
  48. app.MainLoop()
@H_502_2@现在的问题:

@H_502_2@我可以轻松地做一些类似于wxPython中的Java解决方案的东西吗?或者也许,在Java或wxPython中有更好的方法吗?

解决方法

在Python中,您可以将sys.execpthook设置为要为未捕获异常调用函数.那么你不需要装饰器,你可以在钩子函数中集中处理异常. @H_502_2@而不只是打印异常追溯文本,并让它显示在股票stdout窗口中,您可以使用它更智能,例如使用对话框显示文本,并具有允许用户错误信息发送回的控件开发人员,忽略未来的错误,重新启动应用程序,或任何您想要的.

猜你在找的Java相关文章