refactor🎨: (阅读代码):sshFileSystem.ts增加注释

master
yetao 2 weeks ago
parent c84cc72383
commit d4aa1263b4

@ -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);
}
}

Loading…
Cancel
Save