调用的目标已抛出异常SSIS & WinSCP & C#

问题描述

尝试在 SSIS 中执行我的 SCRIPT TASK 时收到此错误消息(我使用的是 VS 2019 和 C#)。

尝试了一段时间,似乎行不通。

错误信息:异常已被一个目标抛出 调用

详情:

   in System.RuntimeMethodHandle.InvokeMethod(Object target,Object[] arguments,Signature sig,Boolean constructor)
   in System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object[] parameters,Object[] arguments)
   in System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,CultureInfo culture)
   in System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Object target,Object[] providedArgs,ParameterModifier[] modifiers,CultureInfo culture,String[] namedParams)
   in Microsoft.sqlServer.Dts.Tasks.ScriptTask.vstaTaskScriptingEngine.ExecuteScript()

这是我的代码

#region Namespaces
using System;
using System.Data;
using Microsoft.sqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Linq;
using WinSCP;
#endregion

namespace ST_2cfb1a0997cf7b332da4453v3g1132g
{
    [Microsoft.sqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.sqlServer.Dts.Tasks.ScriptTask.vstaRTScriptObjectModelBase
    {
            public void Main()
            {

                    Sessionoptions sessionoptions = new Sessionoptions
                    {
                        Protocol = Protocol.Sftp,HostName = "xxxxxxxxxxxxxxxxxxxxxxxxx",UserName = "xxxxxxxxxxxxxxxxxxxxxxxxx",Password = "xxxxxxxxxxxxxxxxxxxxxxxxx",};

                    using (Session session = new Session())
                    {
                        session.Open(sessionoptions);

                        const string externalPath = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                        const string PathLocal = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

                        RemoteDirectoryInfo directoryInfo = session.ListDirectory(externalPath);

    
                        RemoteFileInfo latest =
                            directoryInfo.Files
                                .Where(file => !file.IsDirectory)
                                .OrderByDescending(file => file.LastWriteTime)
                                .FirstOrDefault();

                        if (latest == null)
                        {
                            throw new Exception("Error,not found");
                        }

                        session.GetFiles(
                            externalPath.EscapeFileMask(latest.FullName),PathLocal).Check();
                    }

            }

        #region ScriptResults declaration
        /// <summary>
        /// This enum provides a convenient shorthand within the scope of this class for setting the
        /// result of the script.
        /// 
        /// This code was generated automatically.
        /// </summary>
        enum ScriptResults
        {
            Success = Microsoft.sqlServer.Dts.Runtime.DTSExecResult.Success,Failure = Microsoft.sqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

这里发生了什么?

我做错了什么吗?

解决方法

这听起来像 TargetInvocationException。坏消息是:我们无法告诉您潜在的错误是什么。好消息是运行时可以。对于所有异常,最好捕获它们并查看内部异常。考虑:

try {
    // Your failing code
} catch (Exception ex) {
    while (ex is not null) {
        LogSomewhere($"{ex.Message} ({ex.GetType().Name})");
        ex = ex.InnerException;
    }
    // Todo: decide whether you want to rethrow ("throw") the
    // exception,vs consider it handled
}

您应该会发现这会输出其他有用的信息。

注意:在哪里捕获异常有点难以定义 - 你不应该吞下异常,除非:

  • 您了解具体问题并已对其进行处理,或者
  • 您乐于在“尽最大努力”的基础上工作,或者
  • 带有 catch 的方法是顶级代码 - UI 事件处理程序或线程启动等;如果你不做某事,应用程序将终止

但是,如果您重新抛出或抛出一个新的更具上下文/特定的异常(在这种情况下,您可能应该包括原始异常)以捕获异常以记录/检查它是合理的作为您的新异常的内部异常)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...