Необработанное исключение, невозможно отладить - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь отладить мое приложение на c #, которое проверяет синтаксис MIPS. Но это не позволяет отлаживать его. Независимо от того, где я вхожу в точку останова, она игнорируется, включая первую строку функции Main (). Это также бросает мне эту ошибку. 'add a b c' работает нормально, если я не вызываю HasValidParams () 'добавить b' вызывает исключение в той же ситуации ни один не работает при вызове HasValidParams ()

enter image description here

Program.cs

private static void Main(string[] args)
        {
            var validator = new MipsValidator();
            Console.Write("Please enter a MIPS statement: ");
            string input = Console.ReadLine();
            List<string> arguments = input.Split(new char[0]).ToList();
            Response status = validator.IsSyntaxValid(arguments);
            //Check syntax
            if (status.Success.Equals(true))
            {
                Response stat = validator.HasValidParams(arguments);
                //Check parameters
                if (stat.Success.Equals(true))
                {
                Console.WriteLine(string.Format("'{0}' is a valid mips instruction ", input));
                }
                else
                {
                    foreach (var reason in stat.Reasons)
                    {
                        Console.WriteLine(reason);
                    }
                }
            }
            else
            {
                foreach (string reason in status.Reasons)
                {
                    Console.WriteLine(reason);
                }
            }
        }

MIPS-validator.cs

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace mips_validator.utils
{
    public class MipsValidator : IMipsValidator
    {
        #region Implementation of IMipsValidator

        public Response IsSyntaxValid(List<string> args)
        {
            var response = new Response {Success = true};
            var op = (Operator) Enum.Parse(typeof (Operator), args[0]);
            switch (op)
            {
                case Operator.addi:
                case Operator.add:
                case Operator.beq:
                    if (args.Count != 4)
                    {
                        response.Reasons.Add(string.Format("4 operands required for {0}, {1} parameters provided.",
                                                           op, args.Count));
                        response.Success = false;
                    }
                    break;
                case Operator.j:
                    if (args.Count != 2)
                    {
                        response.Reasons.Add(string.Format("1 operands required for {1}, {0} parameters provided.",
                                                           args.Count, op));
                        response.Success = false;
                    }
                    break;
                default:
                    response.Reasons.Add(string.Format("{0} is an unknown mips operation", op));
                    response.Success = false;
                    break;
            }
            return response;
        }

        public Response HasValidParams(List<string> parameters)
        {
            string op1, op2, op3;
            var temporary = new Regex(@"/\$t\d+/");
            var store = new Regex(@"/\$s\d+/");
            var zero = new Regex(@"/\$zero/");
            var osReserved = new Regex(@"/\$k0|1/");
            var memory = new Regex(@"");
            var constant = new Regex(@"/-?\d*/");
            var label = new Regex(@"/.*\:/");
            Operator operation;
            var response = new Response {Success = true};
            string opString = parameters[0];
            Enum.TryParse(opString.Replace("$", string.Empty), true, out operation);
            switch (operation)
            {
                case Operator.add:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op1));
                            response.Success = false;
                        }
                        if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op2));
                            response.Success = false;
                        }
                    }
                    break;
                case Operator.addi:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op1));
                            response.Success = false;
                        }
                        if (!constant.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error constant expected", op2));
                            response.Success = false;
                        }
                    }
                    break;
                case Operator.beq:
                    {
                        op1 = parameters[1];
                        op2 = parameters[2];
                        op3 = parameters[3];
                        if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1))
                        {
                            response.Reasons.Add(string.Format("{0}:  error register expected", op1));
                            response.Success = false;
                        }
                        if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2))
                        {
                            response.Reasons.Add(string.Format("{0}: error register expected", op2));
                            response.Success = false;
                        }
                        if (!label.IsMatch(op3) && !constant.IsMatch(op3))
                        {
                            response.Reasons.Add(string.Format("{0}: error label or constant expected", op3));
                            response.Success = false;
                        }
                    }
                    break;
            }

            return response;
        }

        #endregion
    }
}

РЕШЕНИЕ ------- Response.cs (старый)

public class Response
{
    public List<string> Reasons;
    public bool Success = true;

}

Response.cs (ток)

 public class Response
    {
        public Response()
        {
            Reasons = new List<string>();
            Success = true;
        }
        public List<string> Reasons;
        public bool Success = true;

    }

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Я не могу сказать, ищите ли вы способ отладки вашего проекта или предпочитаете, чтобы вам сообщали о потенциальных проблемах в вашем коде.

Для последнего:

Убедитесь, что Response.Reasons инициализирован конструктором Response (или инициализатором поля).

2 голосов
/ 07 марта 2012

Вы не показываете класс Response, поэтому убедитесь, что Reasons фактически установлен на коллекцию, которую можно добавить, а не оставить по умолчанию, ноль.

Редактировать: приведенная ниже возможная причина@nodakai указал на то, что авария вообще не была единой;Оказывается, пустой массив символов - это особый случай разделения на пробелы.

* Вы рассчитываете аргументы, выполняя List arguments = input.Split (new char [0]). ToList ();... который, насколько я могу судить, не делает абсолютно ничего , кроме как помещает оригинальную строку в список.Вы, вероятно, хотите разделить на new char[] {' '} вместо того, чтобы разделить на пробелы. *

1 голос
/ 07 марта 2012

Проверьте, выглядит ли ваша точка останова так:

enter image description here

Если это так, ваш исходный код отличается от кода, с которым фактически была скомпилирована сборка. Убедитесь, что ваш проект построен правильно (щелкните правой кнопкой мыши на решении и выберите «Перестроить») и проверьте текущую конфигурацию:

enter image description here

Надеюсь, это поможет ...

...