¿Qué hace que Winforms descarte silenciosamente excepciones no controladas (sin intentos / capturas)?

Estoy a punto de agregar una nueva funcionalidad a mis controles winforms, y parte de eso requiere que una variable que alguna vez se usó siempre sea ahora opcional (si es nula, obtenga los datos de una segunda fuente). Hice algunos cambios y ejecuté mi formulario, solo para descubrir que no pasaba nada, incluso la funcionalidad que funcionaba anteriormente. Confundido, leí el código y descubrí que mi control de usuario de Winforms estaba arrojando unNullReferenceException cuando encontró mi variable, pero en la interfaz de usuario no se arrojaron errores.

Mi configuración es que tengo unaUserControl con un cuadro combinado. Cuando el usuario cambia ese cuadro combinado, carga una @ secundarUserControl en un panel tiene el primer control. El segundo control es lo que arroja la excepción.

Aquí están las rutas de código:

    private void cmbActionType_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (_loading)
            return;

        // ActionType was changed, update the action.ActionType value
        if (cmbActionType.SelectedItem != null)
        {
            if (cmbActionType.SelectedItem.ToString() == SETVALUE_OPTION)
                _action.ActionType = ActionTypes.SetValue;
            else if (cmbActionType.SelectedItem.ToString() == CHECKVALUE_OPTION)
                _action.ActionType = ActionTypes.CheckValue;
            else
                _action.ActionType = ActionTypes.CustomAction;
        }

        RefreshActionPanel();
        _editor.DataModified();
    } 

    private void RefreshActionPanel()
    {
        // Control defaults
        AnchorStyles styles = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
        UserControl subControl = null;

        // Clear the currently active control
        pnlActionDetails.Controls.Clear();

        // Determine what type of control to load in the panel
        if (cmbActionType.SelectedItem != null && cmbCaseType.SelectedItem != null)
        {
            // SetValue or CheckValue actions
            if (cmbActionType.SelectedItem.ToString() == CHECKVALUE_OPTION || cmbActionType.SelectedItem.ToString() == SETVALUE_OPTION)
            {
                if (_caseTypeMap.ContainsKey(cmbCaseType.SelectedItem.ToString()))
                    subControl = new SetCheckActionControl(_action, _editor, _caseTypeMap[cmbCaseType.SelectedItem.ToString()]);
            }

            // CustomAction action type
            else
            {
                // Check if the requested case is a type or defined in a script
                if (_caseTypeMap.ContainsKey(cmbCaseType.SelectedItem.ToString()))
                {
                    subControl = new CustomActionControl(_action, _editor, _caseTypeMap[cmbCaseType.SelectedItem.ToString()]);
                }

                else if (_editor.ScriptDefinitions.Any(x => x.CaseName == cmbCaseType.SelectedItem.ToString()))
                {
                    var definitions = _editor.ScriptDefinitions.Where(x => x.CaseName == cmbCaseType.SelectedItem.ToString()).ToList();
                    subControl = new CustomActionControl(_action, _editor, definitions);
                }
            }
        }

        if (subControl != null)
        {
            subControl.Anchor = styles;
            subControl.Height = pnlActionDetails.Height;
            subControl.Width = pnlActionDetails.Width;
            pnlActionDetails.Controls.Add(subControl);
        }
    }

    public CustomActionControl(TestAction action, fmEditor editor, IList<TcScriptDefinition> scriptDefinitions) : base(action, editor)
    {
        _loading = true;
        InitializeComponent();

        _scriptDefinitions = scriptDefinitions;

        PopulateActionList();
        SetupDataGrid();

        _loading = false;
    }

    private void SetupDataGrid()
    {
        // Clear the current contents of the datagrid
        grdParameters.Rows.Clear();

        if (cmbAction.SelectedItem == null)
            return;

        // Retrieve the action code from the drop down
        string actionCode = cmbAction.SelectedValue.ToString();

        // Check if any paramters are available for this action
        if (!_availableActionParameters.ContainsKey(actionCode))
            return;

        // Add a new row for each parameter available for this action
        foreach (string param in _availableActionParameters[actionCode])
        {
            string display = param;

            // Determine if the parameter has a display string
            if (_formInstance.CodeDisplayMap.ContainsCode(param))
                display = _formInstance.CodeDisplayMap.GetDisplayStringFromCode(param);

            // Create the array for the row, with an empty string as the current value
            string[] row = { display, string.Empty };

            // Check if the current action uses this action code.  
            //   If so, retrieve the value for this parameter and use it in the row
            //   Note: Case-INsensitive comparison must be performed here
            if (_action.Attributes["action"].Equals(actionCode, StringComparison.CurrentCultureIgnoreCase))
                if (_action.Attributes.ContainsKey(param))
                    row[1] = _action.Attributes[param];

            grdParameters.Rows.Add(row);
        }
    }

LosNullReferenceException viene de laSetupDataGrid() método donde_formInstance se llama. Sin embargo, generalmente cuando una aplicación encuentra una excepción no controlada, el sistema JIT arroja un mensaje de error que dice eso (y como puede ver, no haytry/catch declaraciones utilizadas a menos que sea ciego).

¿Por qué mi aplicación winforms no muestra signos de que ocurra una excepción? Prefiero que se produzca un mensaje de excepción no controlado en lugar de que no ocurra nada, ya que eso dificulta a los usuarios saber que algo crítico salió mal (en lugar de no responder a sus comandos)

Editar Para aclarar, ya que parece haber algo de confusión, NO me importa romper esta excepción en Visual Studio al depurar. El hecho es que la aplicación no debería estar ocultando excepciones no controladas, y mi aplicación debería bloquearse (o más bien mostrar el mensaje JIT de que ocurrió una excepción no controlada), incluso cuando no está en modo de depuración fuera del estudio visual.

Esta no es una pregunta de tiempo de depuración, sino una pregunta de tiempo de ejecución de producción. Si este código arroja unOutOfMemoryException por ejemplo, necesito que no se ignore en silencio. En este momento está siendo ignorado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta