C# C语言中的基本错误捕获#

C# C语言中的基本错误捕获#,c#,validation,exception-handling,try-catch,C#,Validation,Exception Handling,Try Catch,我需要有一个基本的错误捕捉,如果用户输入负利率,它会生成一个错误语句。目前我有一个贷款计算器,它会产生一个关于负利率的错误,但它在if-else语句中。我也有一个try-catch语句,但它只在用户键入数字以外的内容时产生错误消息。任何关于如何让try-catch语句为我的负利率生成错误的指导/提示都将非常有用。谢谢 namespace Program_3_Car_Calc { public partial class Form1 : Form { public Form1()

我需要有一个基本的错误捕捉,如果用户输入负利率,它会生成一个错误语句。目前我有一个贷款计算器,它会产生一个关于负利率的错误,但它在if-else语句中。我也有一个try-catch语句,但它只在用户键入数字以外的内容时产生错误消息。任何关于如何让try-catch语句为我的负利率生成错误的指导/提示都将非常有用。谢谢

namespace Program_3_Car_Calc
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e) // Calculate message box 
    {
        double LoanAmount = 0;
        double Payment = 0;
        double InterestRate = 0;
        double DownPayment = 0;
        int PaymentPeriods = 0;

        // Inputs
        try
        {
            InterestRate = Convert.ToDouble(txtRate.Text);
            PaymentPeriods = Convert.ToInt16(Convert.ToDouble(txtTime.Text) * 12);
            LoanAmount = Convert.ToDouble(txtLoan.Text);
            DownPayment = Convert.ToDouble(txtDown.Text);

            // Calculate the monthly payment 
            if (InterestRate > 0)
            {
                InterestRate = InterestRate / 100;
            }

            else
            {
                MessageBox.Show("Error, Please enter a positive number");
            }

            Payment = ((LoanAmount - DownPayment) * Math.Pow((InterestRate / 12) + 1,
           (PaymentPeriods)) * InterestRate / 12) / (Math.Pow(InterestRate / 12 + 1,
           (PaymentPeriods)) - 1);
           Payment = Math.Round(Payment, 2);

            // Ouptput the results of the monthly payment 
            lblMonthlyPayment.Text = "Your Monthly Payment will be: " + "$" + Payment.ToString   ("N2");

        }
        catch
        {
            MessageBox.Show("You have entered an invalid character");
        }


    }
    private void CloseGoodbye(string message, string title = " ", int amount = 0) //Optional Parameter for amount of time message box appears 
    {
        for (int i = 0; i < amount; i++)
        MessageBox.Show(message, title);
        Application.Exit();
    }

    private void cmdFinished_Click(object sender, EventArgs e) // Finished Message box 
    {
        CloseGoodbye("Goodbye", "Loan Calc", 1);
    }


}
名称空间程序\u 3\u Car\u计算
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数)//计算消息框
{
双LoanAmount=0;
双倍支付=0;
双酯=0;
双倍首付=0;
int PaymentPeriods=0;
//投入
尝试
{
InterestRate=Convert.ToDouble(txtRate.Text);
PaymentPeriods=Convert.ToInt16(Convert.ToDouble(txtTime.Text)*12);
LoanAmount=Convert.ToDouble(txtLoan.Text);
首付=Convert.ToDouble(txtDown.Text);
//计算每月的付款
如果(利率>0)
{
利率=利率/100;
}
其他的
{
MessageBox.Show(“错误,请输入正数”);
}
付款=((贷款金额-首期付款)*数学功率((利率/12)+1,
(付款期))*利率/12)/(数学功率(利率/12+1,
(付款期))-1);
付款=数学四舍五入(付款,2);
//输出每月付款的结果
lblMonthlyPayment.Text=“您的每月付款将为:“+”$“+Payment.ToString(“N2”);
}
抓住
{
Show(“您输入了无效字符”);
}
}
private void closebye(string message,string title=“”,int amount=0)//出现时间量消息框的可选参数
{
对于(int i=0;i
我的建议是坚持使用
if
/
else
语句

避免使用
try
/
catch
捕获可预防的错误。这不是最佳做法


如果你一心想抛出一个异常,那么你可以键入

throw new ArgumentException("You have entered an invalid character");
从技术上讲,您可以抛出任何类型的异常,但是
ArguementException
通常用于具有无效参数的情况


请记住,如果您立即捕获此异常,则该异常的全部用途都将丢失

否,请勿为此使用异常。异常用于异常情况,而不是用于用户输入验证。此外,您的try/catch覆盖了太多代码,而catch捕获了太多异常。您不知道发生了什么错误当您在
catch
块中,并且您甚至没有使用
catch(Exception ex)
,以便您可能发现出了什么问题。这是一个非常糟糕的主意。您走错了方向。输入验证应尽可能避免异常。但是如果您想知道如何抛出(引发异常),只需搜索它。您应该使用Double.TryParse通过异常删除对非数字输入的处理…您应该检查输入参数(首先,如果存在),然后检查它们的类型(如果可以转换和更正),接下来是您的业务规则,然后进行计算。换句话说,整个验证周期。我更喜欢使用if/else语句,但任务是在输入负利率时进行基本错误捕获。参数和错误捕获是我们本周学习的内容。错误和异常是两件不同的事情。分配是否指定在用户输入无效值时向用户发出警告,或明确告诉您使用异常处理(即try/catch)?@user3677801:检查用户输入是基本的错误处理。如果作业明确说明您应该为此使用异常,那么请执行两次作业。一次按要求执行,一次按正确的方式执行。如果老师对正确的方式不感兴趣,您仍然应该如此。@Jim Dagg我假设我们需要使用try/catch语句,因为这是我们本周学习的内容。也许我对作业的理解是错误的。“执行基本错误捕获,包括在输入负利率时产生错误。”@David你对这两种方法都有很好的理解。我确实想学习正确的方法。