none
throw ex RRS feed

  • שאלה

  • הי 

    אני בונה תוכנית פשוטה לקונסול-אפליקשן.

    אני זורק ex ממחלקה אחת ורוצה לתפוס אותה במחלקה אחרת - איך אני עושה את זה?

    השאלה נראית פשוטה:

    אני עושה שאלה של רכבת עם קטר וקרון.

    הרכבת במצב עמידה והדלתות פתוחות.

    כאשר המשתמש כותב start הדלתות נסגרות. כאשר הן במצב סגור הן זורקות ex. מי שאמור לתפוס את ה ex הזה היא מחלקת הברקסים. כאשר מחלקת הבקרסים תופסות את ה  ex שהדלתות סגורות הברקסים ישוחררו ויזרקו ex וכו'

    תודה מראש

    שרון

    שבת 13 יוני 2015 20:47

כל התגובות

  • ערב טוב,

    את יכולה לצרף את הקוד שלך כדי להקל את ההבנה של מה את עושה בדיוק והיכן אפשר לשפר?


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    שבת 13 יוני 2015 21:22
    מנחה דיון
  • הי

    חשבתי על משהו שנראה פשוט ודומה למציאות.

    מצב התחלתי הוא שהרכבת עומדת והדלתות פתוחות.

    המשתמש רושם start.

    זה מפעיל את סגירת הדלתות.

    כאשר הדלתות סגורות זה מפעיל אוטומטית את שחרור הברקסים.

    כאשר הברקסים משוחררים זה מפעיל אוטומטית את המנוע שמאץ לכח מסויים.

    כאשר המנוע מגיע לכח המסויים (לא עקרוני מהו) הרכבת מתחילה, אוטומטית, לנסוע.

    כאשר המשתמש מקליד  stop, המנוע עוצר והרכבת מאיטה אוטומטית עד לעצירה.

    כאשר הרכבת נעצרת, אוטומטית הברקסים ננעלים.

    כאשר הברקסים נעולים זה מפעיל אוטומטית את פתיחת הדלתות.

    מצורף הקוד שהתחלתי לרשום. זה עדיין ברמה של שרבוט ולא ברור לי בכלל האם הטכניקה של throw ex היא הטכניקה הנכונה / מועדפת לכך

    תודה מראש

    שרון

    namespace train2
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Enter Start or Stop");
    
                Train t1 = new Train();
                Katar k1 = new Katar();
                Cabin c1 = new Cabin();
                Doors d1 = new Doors();
                Breakes b1 = new Breakes();
                Engain e1 = new Engain();
    
                
              if (Console.ReadLine()== "start")
                {
                    d1.closeDoors();
                }
                else
                {
                    d1.openDoors();
                }
            }
        }
    class Train
        {
    
        }
     class Katar : Train
        {
        }
    class Cabin : Katar
        {
        }
    public class Doors
        {
            public void closeDoors()
            {
                Console.WriteLine("Doors are closing");
                Console.WriteLine("doorsAreMooving()");
                doorsAreMooving();
                Console.WriteLine("doorsAreClosed();");
                doorsAreClosed();
                Console.WriteLine("Doors are closed");
                
            }
            public void doorsAreClosed()
            {
                Exception ex = new Exception("Doors are close");
                throw ex;
            }
            public void openDoors()
            {
                Console.WriteLine("Door are oppening");
                doorsAreMooving();
                doorsAreOpend();
            }
            public void doorsAreOpend()
            {
                Exception ex = new Exception("Doors are full opend");
                throw ex;
            }
            public void doorsAreMooving()
            {
                Console.WriteLine("Doors are  mooving");
            }
        }
    class Breakes
        {
        }
    class Engain
        {
    
        }
    }
    

    יום ראשון 14 יוני 2015 18:31
  • אהלן שרון,

    הדברים ברורים עכשיו אני חושב :-)
    אם אני מבין נכון, אז יש לך בילבול קטן לגבי השימוש בזריקת חריגות (throw Exception)

    כמו שהשם מרמז, Exception היא חריגה מההתנהגות "הנכונה" של התוכנית. זריקת חריגה נועדה למצב קיצוני של התנהגות לא מצופה, ולא לשימוש כחלק ממסלול החיים הרגיל של האפליקציה.

    בדרך כלל התיאור של "אם X אז Y" הוא תיאור שמתקשר לאירועים (events). אבל כתיבה וניהול של אירועים היא פעולה מתקדמת יחסית בפיתוח. 

    אירועים מתנהלים על ידי האזנה להודעות. למשל במחלקה של כפתורים (Button) מובנה האירוע של "לחיצה על הכפתור". ז"א המחלקה כוללת אלמנט מסוג event בשם Click, וישנה מתודה וירטואלית בשם  OnClick אטשר מעלה את ה event של ה click

    // This is the click event signeture
    public event EventHandler Click
    
    // this is the OnClick methode signeture
    protected virtual void OnClick(
    	EventArgs e
    )

    מערכת ההפעלה מאזינה לפעולות של העכבר והמקלדת כל הזמן וכאשר העכבר לוחץ על הכפתור (גם אם לא מוגדר כלום באפליקציה) האירוע "משודר", וכל מי שמאזין לו (למשל האפליקציה) יכול להגיב אליו. 

    עתה אם באפליקציה אנחנו עושים שימוש במחלקה של הכפתורים, ואנחנו מצמידים מתודה מסויימת לאירוע Click באמצעות מנהל האירועים, אז בכל פעם שהאירוע נקלט המתודה הזו תופעל.

    Button1.Click += new EventHandler(this.GreetingBtn_Click);

    מהמעט מידע שיש לי כאן אני לא בטוח שזה הדרך המתאימה לך כרגע. אני מאוד ממליץ לך ללמוד על אירועים וכיצד לעבוד איתם. בינתיים התוכנית שאתה מתאר, היא מאוד פשוטה, ומבצעת פעולות בצורה סינכרונית. כל מה שאתה צריך זה לעבוד עם IF או CASE (כמו שעשית במתודה הראשית שלך) ולבדוק מה המשתמש החזיר, ובהתאם לנתון שהגיע מהמשתמש, אתה מריץ את המתודה (או המתודות הרבות אם רוצים) הבאה במחלקה המתאימה. אתה לא באמת הולך להפעיל דלתות פיסיות אלא רק לשחק עם נתונים המגיעים מהמשתמש.

    בל מקרה אין קשר כאמור לשימוש בחריגות, אלא פשוט לקריאה של מתודות מתוך מתודות, בהתאם לנתונים שהתקבלו לתוך המתודה הנוכחית.

    אם אתה רוצה לזרוק חריגות למשתמש במצב מסויים אז מה טוב אבל זה אומר שהתוכנית תעצר עם הודעת שגיאה וזה ממש לא מה שאתה רוצה.

    שים לב לתמונה הבאה. אפילו ה VS מזהה שהקוד אחרי זריקת החריגה לא יגיע אף פעם. זו אינה שגיאה אלא אזהרה והתוכנית תתקפל בלי בעיה, מכיוון שבמקרים מסויימים זה מה שאנחנו רוצים לבצע

    במקום שימוש בחריגות אתה יכול להציג למשתמש הודעה על המסך בעזרת WriteLine או שאתה יכול לכתוב ללוג למשל בעזרת Console.Log.

    * אם אתה ממש רוצה אז אתה יכול גם להציג הודעות אזהרה כמו alert שקופץ באינטרנט או באפליקציות חלוניות אבל זה מצריך עוד מעט עבודה. 


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    יום שני 15 יוני 2015 14:52
    מנחה דיון
  • הי רונן

    עזרת ל מאוד, תודה.

    התחלתי קורס #C (עצרתי כי לא הספקתי לתרגל יותר מידי) ואני חוזר על החומר לבדי.

    זכור לי נושא ה  events והתשובה עזרה ל מאוד

    תודה 

    שרון

    יום שלישי 23 יוני 2015 18:13
  • אני שמח לשמוע שרון,

    ואני אשמח לראות אותך בהמשך עם שאלות נספות, וכמובן גם עם תשובות לאחרים או סתם לוקח חלק בדיונים :-)

    אל תשכח לסגור את השרשור בבקשה על ידי סימון התשובות שקיבלת, והצבעה על תגובות מועילות (סימון כתשובות נעשה עם הקישורים מתחת להודעת והצבעה נעשית עם הקישור משמאל להודעות)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    יום שלישי 23 יוני 2015 21:12
    מנחה דיון