【问题标题】:How to catch Sublime Text exceptions on their Python interpreter?如何在他们的 Python 解释器上捕获 Sublime Text 异常?
【发布时间】:2016-09-13 02:36:15
【问题描述】:

如何在 Python 解释器上捕获 Sublime Text 异常?

这已迁移到https://github.com/SublimeTextIssues/Core/issues/1359

我正在尝试捕捉这个异常:

    try:

        print( 'RUNNING' )
        sublime.active_window().run_command( "side_bar_update_sync" )
        isNotSyncedSideBarEnabled = False
        print( 'RUNNING THIS' )

    except BaseException:

        isNotSyncedSideBarEnabled = True
        print( 'RUNNING THIS ALSO' )

但是当它运行时,它只是没有捕捉到它。如果我在TypeErrorExceptionBaseException 类中尝试它并不重要。下面是完整的异常输出。

reloading plugin SublimeDefaultSyntax.default_syntax
READ_PREF_ASYNC!!!!
    updateIsSyncedSideBarEnabled!!!!
RUNNING
Traceback (most recent call last):
  File "D:\User\Dropbox\Applications\SoftwareVersioning\SublimeText\sublime_plugin.py", line 538, in run_
    return self.run()
TypeError: run() missing 1 required positional argument: 'enable'
RUNNING THIS
isNotSyncedSideBarEnabled: False

问题是,python 无法捕获run_command( "side_bar_update_sync" ) 抛出的异常。当没有 self 传递时,捕获错误(例如尝试调用 self.view)的异常工作正常。这是完整的代码:

def plugin_loaded():

    global isNotSyncedSideBarEnabled

    packageControlSettings = sublime.load_settings('Package Control.sublime-settings')
    userSettings           = sublime.load_settings('Preferences.sublime-settings')

    def updateIsSyncedSideBarEnabled():

        global isNotSyncedSideBarEnabled

        print('    updateIsSyncedSideBarEnabled!!!!')
        sublime.active_window().run_command( "reveal_in_side_bar" )

        try:

            print( 'RUNNING' )
            sublime.active_window().run_command( "side_bar_update_sync" )
            isNotSyncedSideBarEnabled = False
            print( 'RUNNING THIS' )

        except BaseException:

            isNotSyncedSideBarEnabled = True
            print( 'RUNNING THIS ALSO' )

        print( 'isNotSyncedSideBarEnabled: ' + str( isNotSyncedSideBarEnabled ) )



    def read_pref_async():

        print('READ_PREF_ASYNC!!!!')
        updateIsSyncedSideBarEnabled()


    def read_pref_package():

        print('READ_PREF_PACKAGE!!!!')
        updateIsSyncedSideBarEnabled()


    def read_pref_preferences():

        print('READ_PREF_PREFERENCES!!!!')
        updateIsSyncedSideBarEnabled()


    # read initial setting, after all packages being loaded
    sublime.set_timeout_async( read_pref_async, 1000 )

    # listen for changes
    packageControlSettings.add_on_change( "Package Control", read_pref_package )
    userSettings.add_on_change( "Preferences", read_pref_preferences )

    #print( userSettings.get( "ignored_packages" ) )
    #print( packageControlSettings.get( "installed_packages" ) )

本次讨论之后可能会出现这个 Sublime Text 论坛的帖子:https://forum.sublimetext.com/t/how-to-add-remove-a-default-menu-entry-when-a-x-package-is-isnt-enabled-installed/22753?u=addons_zz

这是异常中显示的文件中的行:

532 class ApplicationCommand(Command):
533     def run_(self, edit_token, args):
534         args = self.filter_args(args)
535         if args:
536             return self.run(**args)
537         else:
538             return self.run()
539
540    def run(self):
541        pass1
542
543 ... other classes

【问题讨论】:

  • 堆栈跟踪与您的源代码无关。是否被截断?你在这里有什么:sublime_plugin.py", line 538, in run_
  • 堆栈跟踪上的文件是带有崇高文本shipped file picture的文件。我将在主帖中添加这些行内容。我的代码在插件上,该插件由另一个崇高文件运行/调用/调用。

标签: python exception exception-handling sublimetext3 sublime-text-plugin


【解决方案1】:

正如问题所述,这确实是 Sublime Text 上的一个错误。这是错误报告中的一个较小的重现:

import sublime_plugin

class TestCommandCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        try:
            ret = self.view.window().run_command("toggle_comment", {"comment": "no"})
        except:
            print("an exception")
        else:
            print(ret)

控制台:

reloading plugin User.test
command: test_command
Traceback (most recent call last):
  File "C:\Program Files\Sublime Text 3\sublime_plugin.py", line 792, in run_
    return self.run(edit, **args)
TypeError: run() got an unexpected keyword argument 'comment'
None

不用说,这只发生在 Python 命令而不是内部命令,因为它们根本不会出错。此外,当您尝试以sublime.active_window().run_command( "reveal_in_side_bar" ) 运行命令并且它不存在时,Sublime Text 不会引发异常。这是为了让插件或菜单项在不可用时不会抛出错误。

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 2014-07-17
    • 1970-01-01
    • 2015-05-30
    • 2015-05-30
    • 2017-03-23
    • 1970-01-01
    • 2023-03-05
    • 2012-01-11
    相关资源
    最近更新 更多