diff --git a/src/sshFileSystem.ts b/src/sshFileSystem.ts index d2a98a2..2fc13a2 100644 --- a/src/sshFileSystem.ts +++ b/src/sshFileSystem.ts @@ -358,61 +358,67 @@ export class SSHFileSystem implements vscode.FileSystemProvider { .catch(e => this.handleError('rename', newUri, e, true)); } // Helper function to handle/report errors with proper (and minimal) stacktraces and such -/** - * 处理错误的受保护方法。 - * @protected - * @method handleError - * @param {string} method - 发生错误的方法名称。 - * @param {vscode.Uri} uri - 与错误相关的资源的 URI。 - * @param {Error & { code?: any }} e - 错误对象。 - * @param {boolean | ((error: any) => void)} doThrow - 控制是否抛出错误,默认为 false。如果是函数,则将错误传递给该函数。 - * @returns {any} 根据不同情况返回不同的值。如果 doThrow 为 false 且没有其他处理,则返回 undefined。 - */ - protected handleError(method: string, uri: vscode.Uri, e: Error & { code?: any }, doThrow: (boolean | ((error: any) => void)) = false): any { - // 判断是否应该忽略错误。如果错误代码为 2(通常表示文件不存在)且满足特定条件,则进行忽略处理。 - const ignore = e.code === 2 && [method === 'stat', shouldIgnoreNotFound(uri.path)]; - if (ignore && ignore.includes(true) && !this.debugFlags.includes('disableignored')) { - e = vscode.FileSystemError.FileNotFound(uri); - // Whenever a workspace opens, VSCode (and extensions) (indirectly) stat a bunch of files - // (.vscode/tasks.json etc, .git/, node_modules for NodeJS, pom.xml for Maven, ...) - // 如果开启了显示被忽略错误的调试标志,则记录被忽略的错误信息。 - if (this.debugFlags.includes('showignored')) { - const flags = `${ignore[0] ? 'F' : ''}${ignore[1] ? 'A' : ''}`; - this.logging.debug(`Ignored (${flags}) FileNotFound error for ${method}: ${uri}`, LOGGING_NO_STACKTRACE); - } - // 如果 doThrow 为 true,则抛出错误;如果 doThrow 是一个函数,则将错误传递给该函数;否则返回 undefined。 - if (doThrow === true) throw e; else if (doThrow) return doThrow(e); else return; - } else if (this.debugFlags.includes('full')) { - // 如果开启了完整错误日志的调试标志,则记录详细的错误信息,包括方法名、URI 和错误对象。 - this.logging.debug.withOptions(LOGGING_HANDLE_ERROR)`Error during ${method} ${uri}: ${e}`; - } else if (this.debugFlags.includes('minimal')) { - // 如果开启了最小错误日志的调试标志,则记录简化的错误信息,包括方法名、URI、错误名称和错误消息。 - this.logging.debug.withOptions({ ...LOGGING_NO_STACKTRACE, maxErrorStack: 0 })`Error during ${method} ${uri}: ${e.name}: ${e.message}`; - } - // Convert SSH2Stream error codes into VS Code errors - // 如果 doThrow 为 true 且错误对象有错误代码,则将 SSH2Stream 的错误代码转换为 VS Code 的错误类型。 - if (doThrow && typeof e.code === 'number') { - const oldE = e; - if (e.code === 2) { // No such file or directory - e = vscode.FileSystemError.FileNotFound(uri); - } else if (e.code === 3) { // Permission denied - e = vscode.FileSystemError.NoPermissions(uri); - } else if (e.code === 6) { // No connection - e = vscode.FileSystemError.Unavailable(uri); - } else if (e.code === 7) { // Connection lost - e = vscode.FileSystemError.Unavailable(uri); - } - // 如果错误被转换且开启了转换错误的调试标志,则记录转换后的错误信息。 - if (e !== oldE && this.debugFlags.includes('converted')) - Logging.debug(`Error converted to: ${e}`); - } - // Display an error notification if the FS_ERROR_NOTIFICATION flag is enabled - // 如果开启了通知错误的标志且当前错误方法在通知错误列表中,则显示错误消息通知。 - if (this.notifyErrorFlags.includes(method.toLowerCase())) { - vscode.window.showErrorMessage(`Error handling ${method} for: ${uri}\n${e.message || e}`); + /** + * 处理错误的受保护方法。 + * @protected + * @method handleError + * @param {string} method - 发生错误的方法名称。 + * @param {vscode.Uri} uri - 与错误相关的资源的 URI。 + * @param {Error & { code?: any }} e - 错误对象。 + * @param {boolean | ((error: any) => void)} doThrow - 控制是否抛出错误,默认为 false。如果是函数,则将错误传递给该函数。 + * @returns {any} 根据不同情况返回不同的值。如果 doThrow 为 false 且没有其他处理,则返回 undefined。 + */ + protected handleError(method: string, uri: vscode.Uri, e: Error & { code?: any }, doThrow: (boolean | ((error: any) => void)) = false): any { + // 判断是否应该忽略错误。如果错误代码为 2(通常表示文件不存在)且满足特定条件,则进行忽略处理。 + const ignore = e.code === 2 && [method === 'stat', shouldIgnoreNotFound(uri.path)]; + if (ignore && ignore.includes(true) && !this.debugFlags.includes('disableignored')) { + e = vscode.FileSystemError.FileNotFound(uri); + // Whenever a workspace opens, VSCode (and extensions) (indirectly) stat a bunch of files + // (.vscode/tasks.json etc, .git/, node_modules for NodeJS, pom.xml for Maven, ...) + // 如果开启了显示被忽略错误的调试标志,则记录被忽略的错误信息。 + if (this.debugFlags.includes('showignored')) { + const flags = `${ignore[0] ? 'F' : ''}${ignore[1] ? 'A' : ''}`; + this.logging.debug(`Ignored (${flags}) FileNotFound error for ${method}: ${uri}`, LOGGING_NO_STACKTRACE); + } + // 如果 doThrow 为 true,则抛出错误;如果 doThrow 是一个函数,则将错误传递给该函数;否则返回 undefined。 + if (doThrow === true) throw e; else if (doThrow) return doThrow(e); else return; + } else if (this.debugFlags.includes('full')) { + // 如果开启了完整错误日志的调试标志,则记录详细的错误信息,包括方法名、URI 和错误对象。 + this.logging.debug.withOptions(LOGGING_HANDLE_ERROR)`Error during ${method} ${uri}: ${e}`; + } else if (this.debugFlags.includes('minimal')) { + // 如果开启了最小错误日志的调试标志,则记录简化的错误信息,包括方法名、URI、错误名称和错误消息。 + this.logging.debug.withOptions({ ...LOGGING_NO_STACKTRACE, maxErrorStack: 0 })`Error during ${method} ${uri}: ${e.name}: ${e.message}`; + } + // Convert SSH2Stream error codes into VS Code errors + // 如果 doThrow 为 true 且错误对象有错误代码,则将 SSH2Stream 的错误代码转换为 VS Code 的错误类型。 + if (doThrow && typeof e.code === 'number') { + // 保存原始错误对象,以便后续比较 + const oldE = e; + // 根据错误代码进行转换 + if (e.code === 2) { // No such file or directory + // 将错误转换为 VS Code 的 FileNotFound 错误类型 + e = vscode.FileSystemError.FileNotFound(uri); + } else if (e.code === 3) { // Permission denied + // 将错误转换为 VS Code 的 NoPermissions 错误类型 + e = vscode.FileSystemError.NoPermissions(uri); + } else if (e.code === 6) { // No connection + // 将错误转换为 VS Code 的 Unavailable 错误类型 + e = vscode.FileSystemError.Unavailable(uri); + } else if (e.code === 7) { // Connection lost + // 将错误转换为 VS Code 的 Unavailable 错误类型 + e = vscode.FileSystemError.Unavailable(uri); + } + // 如果错误被转换且开启了转换错误的调试标志,则记录转换后的错误信息。 + if (e !== oldE && this.debugFlags.includes('converted')) + Logging.debug(`Error converted to: ${e}`); + } + // Display an error notification if the FS_ERROR_NOTIFICATION flag is enabled + // 如果开启了通知错误的标志且当前错误方法在通知错误列表中,则显示错误消息通知。 + if (this.notifyErrorFlags.includes(method.toLowerCase())) { + vscode.window.showErrorMessage(`Error handling ${method} for: ${uri}\n${e.message || e}`); + } + // 如果 doThrow 为 true,则抛出错误;如果 doThrow 是一个函数,则将错误传递给该函数。 + if (doThrow === true) throw e; + if (doThrow) return doThrow(e); } - // 如果 doThrow 为 true,则抛出错误;如果 doThrow 是一个函数,则将错误传递给该函数。 - if (doThrow === true) throw e; - if (doThrow) return doThrow(e); -} }