当我想显示报告并且未安装Crystal报表时,如何捕获所有异常?

时间:2016-01-29 11:45:39

标签: c# wpf crystal-reports

我有一个工具,它从数据库中读取数据,对其进行修改,然后将其显示在水晶报告报告中,该报告显示在单独的窗口中。

该工具有时由没有安装Crystal Reports的人使用,因此我想显示特定的错误消息,告诉用户确切的操作(而不是现在的通用消息)。

我正在用这样的报告调用窗口:

try
{
    ReportWindow report = new ReportWindow(resultList);
    report.Show();
}
catch (Exception ex)
{
    this.LogAction("Could not open the report. To view it, you need to have Crystal Reports installed.", Notification.Error);
}

(为了这个问题简化了catch分支)

ReportWindow.xaml.cs

public ReportWindow(List<MeasureTestResult> measurement)
{
    this._measurementList = measurement;
    InitializeComponent();
}

ReportWindow.xaml

<Window x:Class="ResultFileViewer.Sources.ReportWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:viewer="clr-namespace:SAPBusinessObjects.WPF.Viewer;assembly=SAPBusinessObjects.WPF.Viewer">
    <viewer:CrystalReportsViewer Name="CrystalReportsViewer1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />    
</Window>

InitializeComponent();构造函数中的行ReportWindow会引发一些例外情况,例如XamlParseExceptionInvalidCastException。问题是,只有XamlParseException被捕获。其他异常仅由我的App.xaml的DispatcherUnhandledException属性处理。

这是有问题的,因为它或者意味着当e.Handled设置为false时整个应用程序关闭,或者当e.Handled设置为true时,用户关闭应用程序后仍然保留僵尸进程。

如何在类中捕获当前未处理的异常,即调用报告窗口?

我尝试了this solution,但这也没有抓住InvalidCastException

1 个答案:

答案 0 :(得分:0)

我已经放弃了尝试捕捉流氓异常,因为我没有成功地做到这一点。 相反,我试图预先检测是否安装了Crystal Reports。我基本上找到了两种选择:

  • 检查注册表中的特定条目
  • 检查全局程序集缓存(GAC),如果需要的程序集在那里

注册表检查的缺点是它只包含一个相当通用的名称而不是特定的版本条目(例如<base href=""> )。 此外,如果您事先安装了Crystal Reports并卸载了它,无论出于何种原因,注册表项将保持不变,因此也无法检查Crystal Reports是否已安装。

所以我选择了GAC检查,我这样做了:

HKEY_CURRENT_USER\Software\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0

按预期工作。