C#-框架中的异常处理

C#-框架中的异常处理,c#,exception,exception-handling,frameworks,namespaces,C#,Exception,Exception Handling,Frameworks,Namespaces,我必须用C#编写一个FTP(AUTH-TSL)框架。我不擅长编写框架。 例如,当我证明一个文件存在而它不存在时,我应该怎么做 为使用框架的程序员引发异常 打印ExceptionMessage(Console.WriteLine())而不抛出 例外 在这种情况下,什么是专业的呢?我会抛出一个异常,因为这样框架的用户就可以清楚地知道发生了什么。但我会创建自己的异常类 我不会处理返回代码,因为用户必须知道并解释它们。可能会有错误。事实上,这是一个广泛的问题,但有一些线索可以让你走上正轨: 不要在框

我必须用C#编写一个FTP(AUTH-TSL)框架。我不擅长编写框架。
例如,当我证明一个文件存在而它不存在时,我应该怎么做

  • 为使用框架的程序员引发异常
  • 打印ExceptionMessage(Console.WriteLine())而不抛出 例外

在这种情况下,什么是专业的呢?

我会抛出一个异常,因为这样框架的用户就可以清楚地知道发生了什么。但我会创建自己的异常类


我不会处理返回代码,因为用户必须知道并解释它们。可能会有错误。

事实上,这是一个广泛的问题,但有一些线索可以让你走上正轨:

  • 不要在框架中使用
    Console.WriteLine()
    或任何类似的东西
  • 对于像
    Framework.FileExists
    这样的方法,如果文件不存在,只需返回
    false
    值即可。这就是布尔返回值的本质。这更具语义
  • 对于遇到问题的操作,引发自定义异常或预定义异常。例如,如果您需要一个参数,并且希望确保没有向方法传递null,那么只需检查方法体中的参数,如果该参数为null,则抛出
    ArgumentNullException
  • 要将“错误代码”作为返回值传回,通常使用枚举。 您的上载方法可能会返回

    public enum UploadResult
    {
        Success,
        PasswordInvalid,
        UserInvalid,
        FileNotFound,
        HostNotFound
    }
    
    然后,框架的用户可以像这样轻松地使用它:

    if (Ftp.Upload(User, Pass, Host, File) != UploadResult.Success)
    {
        MessageBox.Show("Sorry, something went terribly wrong.");
    }
    
    或者检查更具体的原因,然后重试


    编辑:正如我在对您的原始帖子的评论中所写的:如果发生了意外事件或用户输入明显无效,抛出异常。

    如果您使用此框架,您希望发生什么?专业的例外是吞咽异常…如上所述,您希望发生什么,或者更确切地说,你希望发生什么。例如,当您调用一个返回布尔值的方法CheckFileExists时,您可能会期望为true或false。但是,如果连接失败,我希望出现异常,因为无法确定文件是否存在。但是,如果相同的方法将返回一个结果,例如枚举,其中一个选项是“couldnotdeterminate”,我可以根据结果编写自己的逻辑。最后,总是有一个选项包含一个参数“Throw”,如果需要,它会抛出。OK,用户必须设置用户名、密码和主机。当他试图上传/下载文件时,我必须检查这些数据。我该怎么办?抛出自定义异常还是什么?在C#中,通常只有在真正“意外”的情况下才会抛出异常。由于密码丢失而无法打开连接并非意外。因此,函数应该返回一个值,指示操作是否成功。在下载数据时拔出网络电缆更出乎意料,但可能仍然只是一个正常的故障,人们希望框架能够处理。如果您的框架被传递了一个大小为-6MB的文件,目标文件夹为空,或者操作系统告诉您它的RAM不足,这是值得一提的。另外,记录该方法可能引发的任何异常。为了正确使用框架,框架的使用者需要知道可能出现的错误。