不确定如何处理交换机中的默认值

本文关键字:交换机 默认值 处理 何处理 不确定 | 更新日期: 2023-09-27 18:26:55

class Program
{
    static void Main(string[] args)
    {
        var getfiles = new fileshare.Program();
        string realname = "*test*";
        string Location = "SVR01";
        foreach (var file in getfiles.GetFileList(realname,Location))
        {getfiles.copytolocal(file.FullName); }
        }
    private FileInfo[] GetFileList(string pattern,string Location)
    {
        try
        {
            switch (Location)
            {
                case "SVR01":
                    {
                        var di = new DirectoryInfo(@"''SVR01'Dev");
                        return di.GetFiles(pattern);
                    }
                case "SVR02":
                    {
                        var di = new DirectoryInfo(@"''SVR02'Dev");
                        return di.GetFiles(pattern);
                    }
                case "SVR03":
                    {
                        var di = new DirectoryInfo(@"''SVR03'Prod");
                        return di.GetFiles(pattern);
                    }
                default: throw new ArgumentOutOfRangeException();
            }
        }
        catch(Exception ex)
        { Console.Write(ex.ToString());
        return null;
        }
    }
    private void copytolocal(string filename)
    {
        string nameonly = Path.GetFileName(filename);
        File.Copy(filename,Path.Combine(@"c:'",nameonly),true);
    }
    }

处理默认的switch语句,但不确定我做对了,有人请纠正我。

提前致谢

不确定如何处理交换机中的默认值

只有在您不希望发生某些事情的情况下,才应引发异常。如果不需要 SRV01/02/03 以外的目录,则可能可以引发异常。如果您预计它会发生并希望优雅地处理它,请不要引发异常。

但是捕获您刚刚抛出的异常并将其写入同一函数中的控制台是没有意义的。你扼杀了在那里抛出异常的所有目的。如果要将错误写入控制台,可以直接在默认语句中执行此操作。

如果要处理GetFiles引发异常的情况,请专门处理它。捕获异常并将其写入控制台没有意义。如果你抓住了它,这意味着你知道该怎么处理它。如果你不这样做,就不要抓住它。

假设您的网络已死,GetFiles会引发IOException。你抓住它并返回 null,你的代码将引发NullReferenceException .因此,您将丢失有关引发该异常的原因的信息。

如果网络连接丢失,您想怎么做?你想退出吗?然后你不需要做任何事情,一个未经处理的异常已经为你做了。您需要继续跑步吗?是否确定?如果应用程序成功退出,是否意味着"它已经完成了它应该做的所有事情"或"可能有问题,但你不在乎"?如果您确定可以"忽略"错误,请捕获异常,通知并继续,这很好。只要确定你的意图。例外不是坏事,也不是坏事。他们在那里,因为他们乐于助人。

我看到您只需要检查某个位置是否在允许的位置列表中。我不认为开关是这样的事情的好候选者。它看起来更像是配置,例如,也许以下行允许您从配置文件中读取此类值。此外,每个switch语句中的逻辑是相同的,所以如果我们能最大限度地减少这种重复,这是一个奖励。

private List<string> _allowedLocations
public YourClassConstructor()
{
   _allowedLocations = new List() 
   {@"''SVR01'Dev", @"''SVR02'Dev", @"''SVR02'Dev"}
}
private FileInfo[] GetFileList(string pattern,string location)
{
   if (location == null) 
      throw new ArgumentNullException("location");
   if (!_allowedLocations.Contains(location))
      throw new ArgumentOutOfRangeException("location");
   var di = new DirectoryInfo(location);
   return di.GetFiles(pattern);
}
switch 语句

中的默认值基本上是 catch all(或您在 catch 语句中执行的操作(。如果某些内容落在您的 switch 语句中并达到默认值,那么它也可能转到您的捕获中。我的建议是,返回一个 null 并写入控制台,无论您的异常是什么。如果您的异常有效,请保持原样。就像@SLaks说的,你可以在默认子句中做任何你想做的事情,因为它是 catch 语句的开关形式。

如果它仅适用于您可以完全控制网络路径的内部环境,那么您可以选择为位置创建一个枚举,这将使您获得在 Intellisense 中显示的每种可能性的优势。 我还同意 Kevin 指出的内容,因为您抛出异常只是为了在相同的方法(反模式(中自己捕获它。 枚举是我唯一的建议,否则您对默认的理解和实现是正确的(即捕获所有意外/无效的情况(。