首页 > 解决方案 > WinSCP .NET 程序集在处理过程中会抛出哪些异常类型

问题描述

我发现 WinSCP 是一个将 SFTP 下载与现有进程集成的绝佳解决方案。但是,我无法找到 .NET 包装器可能引发的错误类型。

我喜欢在可能的地方进行精细的错误处理,但不知道 DLL 会抛出什么样的错误,我需要使用更广泛的错误捕获。我在后台工作线程中运行传输,并且 UI 允许用户在应用程序运行时将文件添加到处理队列中。下面的代码简化了获取源路径和目标路径的过程。

lstFTM是保存要移动的文件的列表框。
lstRes用于记录每次尝试获取

private void DoTransfer()
{
    // Set up session options
    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = "ftp.somesite.com",
        UserName = "user",
        Password = "pass",
        SshHostKeyFingerprint = "ssh-rsa 2048 ABC123xxx and so on",
    };

    using (Session session = new Session())
    {
        // Connect
        try
        {
            session.Open(sessionOptions);

            // Transfer files
            const string remotePath = @"\\NAS\path\*";
            foreach (string _s in lstFTM.Items)
            {
                try
                {
                    session.GetFiles(_s, remotePath).Check();
                    lstRes.Items.Add(string.Format("{0} downloaded on {1}", _s, DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")));
                }
                catch (Exception iex)
                {
                    lstRes.Items.Add(string.Format("file transfer failed for {0} - reported error {1}", _s, iex.Message));
                }

            }
        }
        catch (Exception ex)
        {
            lstRes.Items.Add("session did not open (" + ex.Message + ")");
        }
    }
}

这很好用,但显然我更愿意更谨慎地处理不同类型的异常(文件 IO 与未找到源与权限等)

标签: c#.netsftpwinscpwinscp-net

解决方案


WinSCP .NET 程序集的每个方法都记录了它可以抛出的异常。

例如Session.GetFiles参见:
https ://winscp.net/eng/docs/library_session_getfiles#exceptions

虽然不幸的是,它并不能真正帮助您区分"File IO vs Source not Found vs Permissions 等等"

这是由于程序集的内部实现。


推荐阅读