为了账号安全,请及时绑定邮箱和手机立即绑定

.NET内部函数引发异常时如何从外部函数退出

.NET内部函数引发异常时如何从外部函数退出

C#
侃侃无极 2021-05-10 21:23:01
我在一段代码中无法正确控制流程。我有一个函数GetVoucherNumberAndApplyToDatabase(),它调用一个单独的函数doPatientEncounterCreate()。如果内部函数引发异常,我希望外部函数停止在此执行的操作,因为它取决于返回的返回值。下面是一些代码,以使您更加清楚:    //outer function    private int GetVoucherNumberAndApplyToDatabase(int Mode)    {        int ProviderID = 0;        int PracticeMRNumber = 0;        int VoucherNumber = 0;        string EncounterD = DateTime.Now.ToString("MM\\/dd\\/yyyy");        try        {            EncounterCreateResults = doPatientEncounterCreate(practiceID, PracticeMRNumber, ProviderID, ddlVisitType.SelectedValue, EncounterD);            /*            if (EncounterCreateResults.ErrorMessage.Length > 0)            {                throw Exception;            }            */            ...            //fails bc doPatientEncounterCreate threw exception            ApplyVoucherNumberToBillingCharges(practiceID, ReasonCodeID);        }        catch (ReasonCodeException ex)        {            pnlError.Visible = true;            lblErrorMessage.Text = ex.Message;        }        catch (Exception ex)        {            pnlError.Visible = true;            lblErrorMessage.Text = "An error occurred attempting to call the API: " + ex.Message;          }    }    //inner function    public static EncounterResults doPatientEncounterCreate(int PracticeID, int PatientID                                                  , int ProviderID, string ReasonCodeID, string EncounterD)    {        try        {            DataTable ReasonCodeDT = getSingleReasonCode(PracticeID, ReasonCodeID);            string strReasonCode = String.Empty;            string strReasonDescription = String.Empty;            string strDuration = String.Empty;            string strActive = String.Empty;我采纳了此问题的第二个答案:从内部函数中的代码退出所有函数但是,即使我已将ReasonCodeExceptioncatch块移至外部函数,但在运行代码时,内部函数doPatientEncounterCreate()的泛型异常仍被引发,然后代码在oter函数中继续进行,直到引发异常为止因为它缺少内部函数返回的值。另外,由于内部函数不是void函数,因此我无法遵循上面问题的已接受答案的建议,我需要返回的值。您能提供的任何帮助将不胜感激。
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

对于您要完成的工作,方法中根本没有try catch块是否可以接受doPatientEncounterCreate?


这将允许您GetVoucherNumberAndApplyToDatabase方法中的try catch块捕获在中发生的任何异常doPatientEncounterCreate。


如果您需要在内部方法中使用try catch块,那么正如binDebug在注释中建议的那样,对我来说,在catch块中执行所需的操作然后重新抛出以使您的外部方法可以捕获它是有意义的。


为了弄清我所说的“重新抛出”是什么,这里是对一个示例的引用。并且,这是一个简短的代码段示例:


catch(Exception e)

{

    // do something

    throw;

}


查看完整回答
反对 回复 2021-05-23
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

现在,您已经注释掉了特定的异常捕获,并且仅处理了通用的异常捕获(ALSO捕获了特定的异常捕获)。

现在,您无需再抛出异常,而仅返回有效的响应。

根据需要,您可以通过记录等方式将任何特定的异常作为子级中的适当逻辑链进行处理,然后重新抛出。请注意,有两种可用的重新抛出机制,“ throw”和“ throw ex”。在这里,您需要进行一次抛出,因为它将保留堆栈跟踪,而不会创建嵌套的内部异常。

另一种方法是不处理内部函数中的任何异常,而通常在管道级别上让更高级别的函数进行处理。理想情况下,应在发生时处理所有已知异常,而所有未知异常均应在全局顶级级别上进行一般处理


查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信