📖 Scenario: Imagine you are building a simple banking system. You want to handle errors like withdrawing too much money or depositing invalid amounts in a clear way.
🎯 Goal: You will create custom exception classes to represent specific banking errors, then use them to raise and catch errors in your code.
📋 What You'll Learn
Create custom exception classes inheriting from StandardError
Raise custom exceptions with meaningful messages
Rescue and handle the custom exceptions
Print the error messages when exceptions occur
💡 Why This Matters
🌍 Real World
Custom exceptions help make error handling clearer and more specific in real applications like banking systems, improving user experience and debugging.
💼 Career
Understanding how to create and use custom exceptions is important for writing robust, maintainable code in many programming jobs.
Progress0 / 4 steps
1
Create custom exception classes
Create two custom exception classes called InsufficientFundsError and InvalidDepositError that both inherit from StandardError.
Ruby
Hint
Use class ClassName < StandardError to create a custom exception class.
2
Set up account balance variable
Create a variable called balance and set it to 100 to represent the starting money in the account.
Ruby
Hint
Just write balance = 100 to set the starting amount.
3
Raise exceptions based on conditions
Write a method called withdraw that takes an amount parameter. Inside the method, raise InsufficientFundsError with the message "Not enough money" if amount is greater than balance. Also write a method called deposit that raises InvalidDepositError with the message "Deposit must be positive" if amount is less than or equal to zero.
Ruby
Hint
Use raise ExceptionClass, "message" if condition inside the methods.
4
Rescue exceptions and print messages
Call withdraw(150) and deposit(-20) inside begin blocks. Rescue InsufficientFundsError and InvalidDepositError separately, printing their error messages with puts.
Ruby
Hint
Use begin ... rescue ExceptionClass => e ... puts e.message ... end to catch and print errors.
Practice
(1/5)
1. What is the main purpose of creating a custom exception class in Ruby?
easy
A. To define specific error types for clearer error handling
B. To speed up the program execution
C. To replace all built-in exceptions
D. To automatically fix errors in the code
Solution
Step 1: Understand the role of exceptions
Exceptions represent errors or unexpected events in a program.
Step 2: Purpose of custom exceptions
Custom exceptions let you create specific error types to handle different problems clearly.
Final Answer:
To define specific error types for clearer error handling -> Option A
Quick Check:
Custom exceptions = clearer error handling [OK]
Hint: Custom exceptions clarify error types for better handling [OK]
Common Mistakes:
Thinking custom exceptions speed up code
Believing they replace built-in exceptions
Assuming they fix errors automatically
2. Which of the following is the correct way to define a custom exception class in Ruby?
easy
A. class MyError < StandardError; end
B. class MyError < Exception; end
C. def MyError; end
D. exception MyError inherits StandardError
Solution
Step 1: Check Ruby syntax for class inheritance
In Ruby, custom exceptions inherit from StandardError for best practice.
Step 2: Identify correct class definition
class MyError < StandardError; end correctly defines a class inheriting from StandardError using Ruby syntax.
Final Answer:
class MyError < StandardError; end -> Option A
Quick Check:
Custom exception syntax = class MyError < StandardError [OK]
Hint: Custom exceptions inherit StandardError with class syntax [OK]
Common Mistakes:
Inheriting directly from Exception (not recommended)
Using def instead of class
Wrong inheritance syntax
3. What will be the output of this Ruby code?
class MyError < StandardError; end
begin
raise MyError, "Something went wrong"
rescue MyError => e
puts e.message
end
medium
A. MyError
B. StandardError
C. No output
D. Something went wrong
Solution
Step 1: Understand raise and rescue
The code raises a MyError with message "Something went wrong" and rescues it as variable e.
Step 2: Output from exception message
Inside rescue, puts e.message prints the error message string.
Final Answer:
Something went wrong -> Option D
Quick Check:
e.message prints error message string [OK]
Hint: e.message prints the error message string [OK]
Common Mistakes:
Printing class name instead of message
Expecting no output
Confusing exception class with message
4. Identify the error in this Ruby code defining a custom exception:
class MyError
def initialize(msg)
super(msg)
end
end
medium
A. Incorrect method name 'initialize'
B. Missing inheritance from StandardError
C. super should not be called in initialize
D. Class name should be lowercase
Solution
Step 1: Check class inheritance
The class does not inherit from StandardError or any exception class, so it won't behave as an exception.
Step 2: Confirm other parts are correct
Method name and super call are correct for passing message to parent class.
Final Answer:
Missing inheritance from StandardError -> Option B
Quick Check:
Custom exceptions must inherit StandardError [OK]
Hint: Always inherit StandardError for custom exceptions [OK]
Common Mistakes:
Forgetting to inherit StandardError
Thinking initialize method name is wrong
Believing super call is unnecessary
5. You want to create a custom exception that stores an error code along with the message. Which code correctly implements this?
hard
A. class CodeError < StandardError
def initialize(msg)
@code = msg
end
end
B. class CodeError
def initialize(msg, code)
@code = code
super(msg)
end
end
C. class CodeError < StandardError
attr_reader :code
def initialize(msg, code)
super(msg)
@code = code
end
end
D. class CodeError < Exception
def initialize(code)
@code = code
end
end
Solution
Step 1: Check inheritance and attribute
class CodeError < StandardError
attr_reader :code
def initialize(msg, code)
super(msg)
@code = code
end
end inherits from StandardError and defines attr_reader for code to access it.
Step 2: Verify initialize method
It calls super(msg) to set the message and stores code in @code correctly.
Final Answer:
class CodeError < StandardError with attr_reader and initialize(msg, code) -> Option C
Quick Check:
Custom exception with extra data = class CodeError < StandardError
attr_reader :code
def initialize(msg, code)
super(msg)
@code = code
end
end [OK]
Hint: Use attr_reader and call super(msg) in initialize [OK]
Common Mistakes:
Not inheriting from StandardError
Calling super after instance variables
Missing attr_reader for code
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.