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

时间:2012-03-05 00:14:49

标签: c#

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语句但不确定我是否正确,有些人请指正。

先谢谢

4 个答案:

答案 0 :(得分:4)

只有在您不希望发生某些事情的情况下,才应该抛出异常。如果不期望SRV01 / 02/03以外的目录,则抛出异常可能没问题。如果您希望它发生并想要优雅地处理它,请不要抛出异常。

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

如果要在GetFiles抛出异常时处理这种情况,请专门处理。捕获异常并将其写入控制台是没有意义的。如果你抓住它,就意味着你知道如何处理它。如果不这样做,请不要抓住它。

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

如果网络连接丢失,您想要做什么?你想退出吗?然后你不需要做任何事情,一个未处理的异常已经为你做了。你需要继续跑吗?你确定吗?如果应用程序退出成功将意味着“它已经完成了它应该做的一切”或“可能存在问题,但你不关心”?如果您确定可以“忽略”错误,那么捕获异常,通知并继续,没关系。只要确定你的意图。例外不是坏事或坏事。他们在那里因为他们很有帮助。

答案 1 :(得分:2)

我看到您只需要检查某个位置是否在允许的位置列表中。我认为开关不适合这样的事情。它看起来更像配置,也许沿着以下几行可以让您从配置文件中读取这样的值。每个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);

}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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