如何解决调用的目标已抛出异常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 事件处理程序或线程启动等;如果你不做某事,应用程序将终止
但是,如果您重新抛出或抛出一个新的更具上下文/特定的异常(在这种情况下,您可能应该包括原始异常)以捕获异常以记录/检查它是合理的作为您的新异常的内部异常)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。