 
  
   
  
   
  
   
  
   
  
   
  
   
  
  
 
  
   
  
   
  
  using System;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            var exSample = new Sample { SomeProp = 5 };
            var val = exSample.SomeProp;
            exSample.ChangeSomeProp += ExSample_ChangeSomeProp;
            exSample.DoWork();
        }
        private static void ExSample_ChangeSomeProp(object sender, ChangePropDelegateArgs args)
        {
            Console.WriteLine($"value from event: {args.Value}");
        }
    }
    internal class ChangePropDelegateArgs
    {
        public int Value { get; private set; }
        public ChangePropDelegateArgs(int val)
        {
            Value = val;
        }
    }
    internal class Sample
    {
        private int _someProp = 0;
        public event ChangePropDelegate ChangeSomeProp;
        public int SomeProp
        {
            get
            {
                SomePropChange(_someProp, "read");
                return _someProp;
            }
            set
            {
                _someProp = value;
                SomePropChange(_someProp, "write");
            }
        }
        private void SomePropChange(int val, string mode)
        {
            Console.WriteLine($"value: {val} mode: {mode}");
        }
        public void DoWork()
        {
            OnChangeSomeProp(new ChangePropDelegateArgs(_someProp));
        }
         
        protected virtual void OnChangeSomeProp(ChangePropDelegateArgs args)
        {
            ChangeSomeProp?.Invoke(this, args);
        }
    }
    internal delegate void ChangePropDelegate(object sender, ChangePropDelegateArgs args);
} 
  
  
using System;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            var exSample = new ExceptionSample();
            try
            {
                exSample.MethodOne();
            }
            catch (Exception e)
            {
                Console.WriteLine($"something wrong, {e.Message}\nStack trace: {e.StackTrace}");
                if (e.InnerException != null)
                    Console.WriteLine($"inner exception, {e.InnerException.Message}\nStack trace: {e.InnerException.StackTrace}");
            }
        }
    }
    class ExceptionSample
    {
        public void MethodOne()
        {
            try
            {
                MethodTwo();
            }
            catch (NotImplementedException e)
            {
                throw new Exception("MethodOne catch block",e);
            }
        }
        private void MethodTwo()
        {
            throw new NotImplementedException();
        }
    }
} 
  
   
  
   
  
  