gpt4 book ai didi

c# - 将上下文与 UI 应用程序中抛出的异常相关联的推荐方法是什么?

转载 作者:行者123 更新时间:2023-11-30 22:39:02 26 4
gpt4 key购买 nike

我有一个 UI 应用程序,它访问数据库并且还必须能够对文件执行各种操作。不用说,在应用程序的过程中可能会抛出各种/无数的异常,例如:

  • 数据库离线。
  • 找不到文件(之前扫描到数据库中)。
  • 该文件被另一个用户/进程锁定,无法访问。
  • 文件设置为只读属性,不能修改。
  • 安全权限拒绝访问文件(读或写)。

错误的准确细节在引发异常的地方是已知的。但是,有时您需要让异常在调用堆栈的更高层被捕获,以包含异常的上下文,以便您可以创建并显示用户友好的错误消息;例如在文件复制、文件移动或文件删除操作期间,可能会遇到文件被另一个进程锁定的情况。

为了便于讨论,假设我们有一个必须对文件执行各种操作的方法;它必须将文件读入内存,修改数据并将数据写回,如下例所示:

private void ProcessFile(string fileName)
{
try
{
string fileData = ReadData(fileName);

string modifiedData = ModifyData(fileData);

WriteData(fileName, modifiedData);
}
catch (UnauthorizedAccessException ex)
{
// The caller does not have the required permission.
}
catch (PathTooLongException ex)
{
// The specified path, file name, or both exceed the system-defined maximum length.
// For example, on Windows-based platforms, paths must be less than 248 characters
// and file names must be less than 260 characters.
}
catch (ArgumentException ex)
{
// One or more paths are zero-length strings, contain only white space, or contain
// one or more invalid characters as defined by InvalidPathChars.
// Or path is prefixed with, or contains only a colon character (:).
}
catch (NotSupportedException ex)
{
// File name is in an invalid format.
// E.g. path contains a colon character (:) that is not part of a drive label ("C:\").
}
catch (DirectoryNotFoundException ex)
{
// The path specified is invalid. For example, it is on an unmapped drive.
}
catch (FileNotFoundException ex)
{
// File was not found
}
catch (IOException ex)
{
// Various other IO errors, including network name is not known.
}
catch (Exception ex)
{
// Catch all for unknown/unexpected exceptions
}
}

在记录错误消息并向用户显示错误消息时,我们希望尽可能详细地说明出了什么问题以及可能导致解决方案的任何可能建议。如果文件被锁定,我们应该能够通知用户,以便他可以稍后在文件被释放时重试。

在上面的示例中,使用所有异常 catch 子句,我们仍然不知道哪个操作(上下文)导致了异常。打开和读取文件时、修改数据时或将更改写回文件系统时是否发生了异常?

一种方法是将 try/catch block 移动到这些“操作”方法中的每一个中。这意味着将相同的异常处理逻辑复制/重复到所有三种方法中。当然,为了避免在多个方法中重复相同的逻辑,我们可以将异常处理封装到另一个通用方法中,该方法将调用捕获通用 System.Exception 并将其传递。

另一种方法是添加“枚举”或其他定义上下文的方法,以便我们知道异常发生的位置,如下所示:

public enum ActionPerformed
{
Unknown,
ReadData,
ModifyData,
WriteData,
...
}

private void ProcessFile(string fileName)
{
ActionPerformed action;

try
{
action = ActionPerformed.ReadData;
string fileData = ReadData(fileName);

action = ActionPerformed.ModifyData;
string modifiedData = ModifyData(fileData);

action = ActionPerformed.WriteData;
WriteData(fileName, modifiedData);
}
catch (...)
{
...
}
}

现在,在每个 catch 子句中,我们将知道引发异常时正在执行的操作的上下文。

是否有推荐的方法来解决识别与异常相关的上下文这一问题?这个问题的答案可能是主观的,但如果有设计模式或推荐的方法,我愿意遵循。

最佳答案

当您创建异常时,在抛出异常之前将其 Message 属性设置为描述性的内容。然后向上你可以只向用户显示此消息。

关于c# - 将上下文与 UI 应用程序中抛出的异常相关联的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5888824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com