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

How to catch Sublime Text exceptions on their Python interpreter?

如何在他们的 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.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 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 不会抛出异常。这是为了让插件或菜单条目在不可用时不会抛出错误。