首页 > 解决方案 > Stacktrace 仅显示错误例程中的第一行并且不完整

问题描述

这有点奇怪,因为我以前在 C# 中从未见过。今天有个用户打电话说他不能运行我们这里说的程序。本例中的程序是从 VB6 到 .Net 4.6.1 的移植,并且已经完美运行了一年多。有问题的用户是我们的新同事,因此将一些初始设置添加到数据库中。

他遇到的问题是在下面的例程中:

    protected void Initialiseer()
    {
        //_logCallback("Initialiseer");

        // Unieke code voor PC/process bepalen
        CPcpid = Environment.MachineName + "_" + Process.GetCurrentProcess().Id;

        LogMessage($"Unique identifier: {CPcpid}");

        // De persoonlijke gegevens ophalen
        var rst = SltlUserRepo.GetUserByPpUser(CUser);
        var user = Ep3UserRepo.GetUserByPpUser(CUser);

        // Failsafe for testing purposes only, cPrfId is 0 for 'koepelproef'
        if (CPrfId != 0 && user.PRF_ID != CPrfId)
        {
            throw new InvalidOperationException($"Default proefId komt niet overeen met parameter {user.PRF_ID} != {CPrfId}");
        }

        var mSchijf = $@"\\WURNET.NL\Homes\{Environment.UserName}\";
        CStartDir = Nz(user.STARTDIR, "").Replace(@"M:\", mSchijf).Replace(@"m:\", mSchijf);
        CUserNaam = Nz(rst.NAAM, "");
        CGewCode = Nz(rst.GEW_CODE, "");
        CTltCode = Nz(rst.TLT_CODE, "");
        CRegCode = Nz(rst.REG_CODE, "");
        CJaar = Convert.ToInt16(Nz(rst.JAAR, ""));

        ...

此错误的堆栈跟踪如下:

     2021-07-06 13:36:33.2309 Wur.Epros.ImportWaarnemingen.WinApp.Program.Main Error Unhandled Exception:
 Error while building type Wur.Epros.Core.Models.ImportWaarnemingenModel.  See the inner exception for details
1.) new ImportWaarnemingenModel()
2.) Wur.Epros.Core.Models.ImportWaarnemingenModel
3.) Instance of Wur.Epros.Core.Models.ImportWaarnemingenModel
4.) Container.GetInstance<Wur.Epros.Core.Models.ImportWaarnemingenModel>()

Stacktrace:
   at lambda_method(Closure , IBuildSession , IContext )
   at StructureMap.Building.BuildPlan.Build(IBuildSession session, IContext context)
   at StructureMap.BuildSession.BuildNewInSession(Type pluginType, Instance instance)
   at StructureMap.Pipeline.NulloTransientCache.Get(Type pluginType, Instance instance, IBuildSession session)
   at StructureMap.BuildSession.ResolveFromLifecycle(Type pluginType, Instance instance)
   at StructureMap.SessionCache.GetObject(Type pluginType, Instance instance, ILifecycle lifecycle)
   at StructureMap.SessionCache.GetDefault(Type pluginType, IPipelineGraph pipelineGraph)
   at StructureMap.Container.GetInstance[T]()
   at Wur.Epros.ImportWaarnemingen.WinApp.FrmImportWaarnemingen..ctor() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.ImportWaarnemingen.WinApp\FrmImportWaarnemingen.cs:line 25
   at Wur.Epros.ImportWaarnemingen.WinApp.Program.Main() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.ImportWaarnemingen.WinApp\Program.cs:line 34

Inner Exception
Input string was not in a correct format.
Stacktrace:
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Int16.Parse(String s, NumberStyles style, NumberFormatInfo info)
   at System.Convert.ToInt16(String value)
   at Wur.Epros.Core.Workers.WorkerBase.Initialiseer() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Workers\WorkerBase.cs:line 178
   at Wur.Epros.Core.Models.ImportWaarnemingenModel..ctor() in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Models\ImportWaarnemingenModel.cs:line 45
   at lambda_method(Closure , IBuildSession , IContext )

亮点是

在第 178 行的代码中:

  CPcpid = Environment.MachineName + "_" + Process.GetCurrentProcess().Id;

在堆栈跟踪中:

   at Wur.Epros.Core.Workers.WorkerBase.Initialiseer() 
      in E:\Jenkins\workspace\EPROS Nightly (.Net)\Wur.Epros\Wur.Epros.Core\Workers\WorkerBase.cs:line 178

从我们看到这一点的第一刻起,我们就不相信所提供的信息。永远不可能是那条线。经过一些调试并在生产中运行(耗时),我们发现下面的行是问题所在:

   CJaar = Convert.ToInt16(Nz(rst.JAAR, ""));

当 'obj' == null 时,与 VB6 Nz 例程等效的例程 'Nz' 返回 'vervanging',情况正是如此。在数据库中,列 JAAR 的值为 NULL。当然空字符串不能解析为int。

    public string Nz(object obj, string vervanging)
    {
        if (obj == null)
        {
            return vervanging;
        }

        return obj.ToString();
    }

我希望在堆栈跟踪中看到的不是第 178 行,而是第 198 行,这是错误代码的行。它让我们失望了一段时间。谁能解释为什么堆栈跟踪看起来像它的样子?

标签: c#stack-trace

解决方案


推荐阅读