«خطاهای زمان کامپایل» (Compile-time errors) حاصل اشتباه فاحش برنامهنویس بوده و معمولا نیز کشف و برطرف نمودن آنها نیز بسیار ساده میباشد و از عدم رعایت درست قواعد زبان برنامهنویسی مانند سینتکس نشات میگیرند.
اما بروز «خطاهای زمان اجرا» (Runtime errors) میتواند به عوامل گوناگونی وابسته باشد همانند دخالت یک عامل بیرونی یا مشکلات سختافزاری که ناگهان به برنامه تحمیل میگردند که اگر از فرض این احتمال نیز صرف نظر کنیم!، باز هم برای دفاع در برابر این دسته از خطاها، برنامهنویس میبایست کاملا هوشیار باشد. به خصوص در زبانهای برنامهنویسی پویا به مانند پایتون که انواع داده در زمان اجرا تعیین میگردند. برای مثال فرض کنید در داخل یک تابع قرار است با یک نوع int
کار شود ولی به علت ضعف برنامهنویسی و عدم کنترل ورودیها، یک داده با نوع str
به آن ارسال گردد که در این صورت نتیجه مشخص است! البته جلوگیری از این دست خطاها نیز همچنان ساده میباشد!. گاهی ممکن است وضعیت آنچنان مهلک باشد که یا خیلی دیر به وجود یک خطا در برنامه پی ببریم یا برای کشف علت آن زمان زیادی صرف کنیم یا هر دو! به این نوع از خطاهای زمان اجرا، «خطاهای منطقی» (Logical errors) گفته میشود.
«خطاهای منطقی» (Logical errors) برخلاف دیگر خطاها باعث توقف اجرای برنامه نشده بلکه باعث تولید نتایج نادرستی میشوند که از دیدگاه برنامهنویسی درست بوده ولی از دیدگاه منطقی کاملا اشتباه هستند. به عنوان یک مثال ساده فرض کنید فرمول محاسبه معدل اشتباه پیادهسازی شده باشد! این نوع خطا مصداق بارز «باگ» (Bug) در برنامه است که همیشه پیشگیری، از کشف و اصلاح آنها به مراتب سادهتر خواهد بود.
با وجود این توضیحات و همانطور که مشاهده خواهید کرد، بروز خطا همواره یک امر زشت و ناخواسته نبوده بلکه گاهی نیز یک استراتژی از سوی برنامهنویس خواهد بود تا یک وضعیت را به سطوح دیگر از برنامه اعلام یا اینکه مستقیما تغییری در روند اجرای برنامه ایجاد کند. در این صورت خطاها دیگر با نام زشت خطا خوانده نمیشوند بلکه به آنها استثنا یا اعتراض یا Exception میگویند.
به صورت کلی، Exception امکانی برای خروج برنامه از یک وضعیت مشخص است و بروز آن، همانند اعلام عمومی یک خبر مهم در برنامه میباشد. میتوان با پیشبینی بروز Exceptionها در برنامه، به اصطلاح آنها را catch نمود و فرآیندی - یا به اصطلاح یک handler - را برای مدیریت آنها پیادهسازی کرد.