我的解决方案中有3个项目。
A:主程序,使用界面调用插件。
Plugin plugin = Plugin.GetPluginByName("FILE_ANALYZER");
if (plugin != null)
{
try // show preview of data inside this file using plugin
{
plugin.Interface.Run(forThisFile);
labelResultInfo.Text = plugin.Interface.ResultText;
}
catch // (Exception mainEx)
{
error = true;
}
}
B:带插件接口的DLL +所有可以插件用于工作的“通用”方法。此类使用epplus dll中的方法。
public bool LoadFile()
{
if (!this.FileInfoInitialized.Exists) { return false; }
try
{ // load new excel package from existed file
this.Package = new ExcelPackage(this.FileInfo); // using epplus
return true;
}
catch { return false; }
}
C:我的插件DLL,实现B中定义的接口并调用B方法
public bool Run(string fileToAnalyze = "")
{
var rep = ExcelReport(fileToAnalyze);
if (rep.LoadFile())
{
ResultText = "Correct XLSX file";
return true;
}
else
{
ResultText = "Incorrect file, but you can continue without error";
return false;
}
}
现在,我可以加载插件而不会出现任何错误,我也可以从程序 A 中调用plugin.Interface.Run(forThisFile);
。如果我发送的文件不正确,我希望程序声明格式不正确但允许我继续而不会出错。 但不是。程序按以下顺序执行步骤:
1. plugin.Interface.Run(forThisFile); // A // is called with "Not_excel_file.txt"
2. var rep = ExcelReport(fileToAnalyze); // C // is initialized
3. rep.LoadFile() ==> LoadFile() // C ==> B // method from DLL B is called
4. this.Package = new ExcelPackage(this.FileInfo); // B // throw an Exception
>> epplus: File contains corrupted data.
5. catch from LoadFile() return false; // B // exception is catched inside B and return false to C
6. ResultText = "Incorrect file, but you can continue without error"; // C // "if (rep.LoadFile())" in C evaluate "false result" correct way
7. return false; // C ==> A // and return false to main program
8. // And this step is problem
// Now, after return false from C, debugger stay on row in main program A:
error = true;
// And this row was skipped and never called:
labelResultInfo.Text = plugin.Interface.ResultText;
// If I enable catch mainEx, then this Exception is:
>> Object reference not set to an instance of an object.
// In output window I get this after step 5:
>> A first chance exception of type 'System.IO.FileFormatException' occurred in WindowsBase.dll
>> A first chance exception of type 'System.IO.FileFormatException' occurred in EPPlus.dll
// And this message in actual step:
>> A first chance exception of type 'System.NullReferenceException' occurred in MyInterfaceDLL_B.dll
(注意:这是修改后的代码,我的界面更复杂,但错误就是这样表现出来的)
有人能说出原因吗?
如何在dll中捕获异常而不是将其抛入主程序?
我知道我只能在此行中遇到 A 错误:plugin.Interface.Run(forThisFile);
然后在标签中初始化文字,但为什么这不起作用?
我根据您的问题尝试了什么?
labelResultInfo.Text = plugin.Interface.ResultText;
中找到空引用吗?我已启用所有公共语言运行时例外并修改 A 以显示plugin.Interface.ResultText
内的内容。 A :
catch // (Exception mainEx)
{
error = true;
labelResultInfo.Text = plugin.Interface.ResultText;
}
运行后:
搜索代码后。 >>这是包装的一部分,在尝试使用不正确的文件后关闭。所以我修改了dispose:if (this.Package != null) this.Package.Dispose();
和现在所有异常都被正确捕获。
感谢您的帮助。